2012-03-08 461 views
3

我预计大小会有所不同。但两者都显示8字节。unsigned long和unsigned long long有什么区别?

#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 2012-03-08 04:41:45

+5

简短的回答:*实现定义*。 – iammilind 2012-03-08 04:42:50

+0

我认为标准C++没有'unsigned long long'类型?也许,C++ 11引入了这个? – Nawaz 2012-03-08 04:54:17

回答

8

他们是两种不同类型的,即使他们碰巧在一些特定的实现相同的大小和代表性。

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 
} 

产生当我克++编译它执行以下操作:

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 longunsigned long long类型直到2011年Ç将它们添加到1999年的标准中,并且Pre-C++ 2011(和C99之前)编译器将它们作为扩展提供它们的情况并不少见。

0

标准说long long必须至少与long一样大或更大。分别为unsigned类型,longint

实际值是实现和硬件相关的。

相关问题