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

时间:2012-03-08 04:40:27

标签: 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

3 个答案:

答案 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 longunsigned long long类型.C在1999年标准中添加了它们,并且对于预C ++ 2011来说并不罕见(和C99之前的编译器提供它们作为扩展。

答案 1 :(得分:1)

它被定义为iammilind指向的实现 有关详细信息,请参阅How many bytes is unsigned long long?

答案 2 :(得分:0)

标准规定long long必须至少与long相同或更大。分别为unsigned类型,longint

实际值取决于实现和硬件。