无符号长整型(unsigned long)和无符号长长整型(unsigned long long)有什么区别?

6

我原以为大小会不同,但是两个都显示为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

1
在Windows上尝试一下,你就会明白... - Mysticial
6
简短回答:实现定义 - iammilind
我认为标准的C++没有unsigned long long类型?也许,C++11引入了这个类型? - Nawaz
3个回答

11
它们是两种不同的类型,即使它们在某些特定的实现中具有相同的大小和表示形式。 `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

0

标准规定,long long 必须至少与 long 相同大小,或更大。同样适用于无符号类型 longint

实际值取决于具体的实现和硬件环境。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接