unsigned long和unsigned long long有什么区别?

cpp*_*der 3 c++ long-integer

我预计尺寸会有所不同.但两者都显示了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)

Kei*_*son 9

它们是两种不同的类型,即使它们碰巧在某些特定实现中具有相同的大小和表示.

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 longunsigned long long类型.C用1999标准添加它们,并且前C++ 2011(和C99之前)编译器提供它们作为扩展并不罕见.