我预计尺寸会有所不同.但两者都显示了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
Run Code Online (Sandbox Code Playgroud)
它们是两种不同的类型,即使它们碰巧在某些特定实现中具有相同的大小和表示.
unsigned long要求至少为32位. unsigned long long要求至少为64位.(实际上,要求是根据它们可以代表的值范围来陈述的.)
正如您所见,只要该大小至少为64位,这与它们的大小相同是一致的.
在大多数情况下,它们是不同类型的事实并不重要(除了你不能依赖它们具有相同的值范围).例如,您可以将一个对象分配unsigned long long给一个unsigned long对象,该值将被隐式转换,可能会丢失一些信息.类似地,您可以将unsigned long long参数传递给期望a的函数unsigned long(除非该函数是可变参数,例如printf;然后需要显式转换).
但有一点重要的是当你有指针时.类型unsigned long*并且unsigned long long*不仅仅是不同的,它们不是赋值兼容的,因为没有从一个到另一个的隐式转换.例如,这个程序:
int main()
{
unsigned long* ulp = 0;
unsigned long long* ullp = 0;
ulp = ullp; // illegal
}
Run Code Online (Sandbox Code Playgroud)
当我用g ++编译它时产生以下内容:
c.cpp: In function ‘int main()’:
c.cpp:5:11: error: cannot convert ‘long long unsigned int*’ to ‘long unsigned int*’ in assignment
Run Code Online (Sandbox Code Playgroud)
还有一个区别:C++标准在2011年之前没有添加long long和unsigned long long类型.C用1999标准添加它们,并且前C++ 2011(和C99之前)编译器提供它们作为扩展并不罕见.
| 归档时间: |
|
| 查看次数: |
10232 次 |
| 最近记录: |