我预计尺寸会有所不同。但两者都显示了8字节。
#include <iostream>
using namespace std;
int main()
{
cout<<"Size of long:"<<sizeof(unsigned long)<<"\n";
cout<<"Size of Long Long:"<< sizeof(unsigned long long)<<"\n";
}
Output:
Size of long:8
Size of Long Long:8
答案 0 :(得分:9)
它们是两种不同的类型,即使它们碰巧在某些特定实现中具有相同的大小和表示。
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
}
当我用g ++编译它时,产生以下内容:
c.cpp: In function ‘int main()’:
c.cpp:5:11: error: cannot convert ‘long long unsigned int*’ to ‘long unsigned int*’ in assignment
还有一个区别:C ++标准在2011年之前没有添加long long
和unsigned long long
类型.C在1999年标准中添加了它们,并且对于预C ++ 2011来说并不罕见(和C99之前的编译器提供它们作为扩展。
答案 1 :(得分:1)
它被定义为iammilind指向的实现 有关详细信息,请参阅How many bytes is unsigned long long?
答案 2 :(得分:0)
标准规定long long
必须至少与long
相同或更大。分别为unsigned
类型,long
和int
。
实际值取决于实现和硬件。