他们是两种不同类型的,即使他们碰巧在一些特定的实现相同的大小和代表性。
unsigned long
需要至少32位。 unsigned long long
必须至少为64位。 (其实这些要求是以它们可代表的值的范围来表示的。)
正如你所看到的,这与它们都是相同的大小一致,只要该大小至少为64位。
在大多数情况下,它们是不同类型的事实并不重要(除非您不能依赖它们都具有相同的值范围)。例如,您可以将unsigned long long
指定给unsigned long
对象,并且该值将被隐式转换,可能会丢失一些信息。同样,您可以将unsigned long long
参数传递给期望unsigned long
的函数(除非该函数是可变参数,如printf
;然后需要显式转换)。
但是,其中一个重要的是当你有指针。类型unsigned long*
和unsigned long long*
不只是不同,它们不是分配兼容的,因为不存在从一个到另一个的隐式转换。例如,此程序:
int main()
{
unsigned long* ulp = 0;
unsigned long long* ullp = 0;
ulp = ullp; // illegal
}
产生当我克++编译它执行以下操作:
c.cpp: In function ‘int main()’:
c.cpp:5:11: error: cannot convert ‘long long unsigned int*’ to ‘long unsigned int*’ in assignment
一个更差:C++标准没有添加long long
和unsigned long long
类型直到2011年Ç将它们添加到1999年的标准中,并且Pre-C++ 2011(和C99之前)编译器将它们作为扩展提供它们的情况并不少见。
尝试在Windows上,你会看到... – Mysticial 2012-03-08 04:41:45
简短的回答:*实现定义*。 – iammilind 2012-03-08 04:42:50
我认为标准C++没有'unsigned long long'类型?也许,C++ 11引入了这个? – Nawaz 2012-03-08 04:54:17