我预计尺寸会有所不同。但两者都显示 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
它们是两种不同的类型,即使它们在某些特定实现中碰巧具有相同的大小和表示形式。
unsigned long
要求至少为 32 位。unsigned long long
要求至少为 64 位。 (实际上,这些要求是根据它们可以代表的值的范围来表述的。)
正如您所看到的,这与它们具有相同的大小是一致的,只要该大小至少为 64 位即可。
在大多数情况下,它们是不同类型这一事实并不重要(除非您不能依赖它们都具有相同的值范围)。例如,您可以分配一个unsigned long long
to an unsigned long
对象,并且值将被隐式转换,可能会丢失一些信息。同样,您可以通过unsigned long long
函数的参数期望unsigned long
(除非该函数是variadic, like printf
;那么需要显式转换)。
但它确实很重要的一种情况是当你有pointers。类型unsigned long*
and 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++ 标准没有添加long long
and unsigned long long
类型直到 2011 年才出现。C 在 1999 年标准中添加了它们,并且 C++2011 之前(和 C99 之前)编译器将它们作为扩展提供的情况并不罕见。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)