他們是兩種不同類型的,即使他們碰巧在一些特定的實現相同的大小和代表性。
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 long
和unsigned long long
類型直到2011年Ç將它們添加到1999年的標準中,並且Pre-C++ 2011(和C99之前)編譯器將它們作爲擴展提供它們的情況並不少見。
嘗試在Windows上,你會看到... – Mysticial 2012-03-08 04:41:45
簡短的回答:*實現定義*。 – iammilind 2012-03-08 04:42:50
我認爲標準C++沒有'unsigned long long'類型?也許,C++ 11引入了這個? – Nawaz 2012-03-08 04:54:17