2012-03-08 403 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

實際值是實現和硬件相關的。

相關問題