2011-09-18 75 views
2

我使用Eclipse CDT - 在Windows 7上跨G ++編者(MinGW的/ MSYS),這是我的代碼:的int64_t溢出問題

int64_t y = 1024 * 1024 * 1024 * 4; 
std::cout << "type id: " << typeid(y).name() << "; value: " << y << "; size of y: " << sizeof(y) << std::endl; 

(IDE會警告: 「整數溢出」。)

輸出是:

"type id: x; value: 0; size of y: 8" 

我不明白,爲什麼Y的大小爲8個字節,但值爲0

感謝您的幫助。

回答

3

你應該明確地轉換字面來int64_t

int64_t y = (int64_t)1024 * 1024 * 1024 * 4; 

1024 * 1024 * 1024 * 4文字是int,不int64_t

1

當寫入「1024」在C++表達式,像在您的問題,寫一個整數文字,其尺寸爲4個字節,即32位(如它的類型將是intunsigned int) ,所以最後乘以4使得4字節的整數溢出。試試這個:

int64_t y = ((int64_t)1024) * 1024 * 1024 * 4; 
+0

'1024'類型爲'int',它可以是也可以不是32位,可以是也可以不是4個字節。 –

+0

在「Eclipse CDT,Cross G ++ Complier」中,「int」的大小沒有「可能或不可能」,並且它總是一些不變的數字,最可能是4個字節。但是,是的,C++標準沒有指定「int」的大小,由編譯器決定。 –

+0

一個小點:外括號是不必要的:'int64_t y =(int64_t)1024 * 1024 * 1024 * 4;' –

2

,你將結果分配到int64_t是無關緊要的事實。重要的是,當您乘以int類型的兩個值時,結果也有類型int。由於所有1024,1024,1024和4都是int類型的常量,因此產生的臨時產品計算爲int,該值溢出。

解決方案是使這些常數中的至少一個爲int64_tint64_tint的乘積爲int64_t,因此64位將級聯貫穿整個產品。您可以使用有明確的轉換或整數後綴做到這一點:

int64_t y = (int64_t)1024 * 1024 * 1024 * 4; // explicit cast 
int64_t y = 1024ll * 1024 * 1024 * 4; // integer suffix 'll' 

整型常量後說後綴ll(或等價LL)「這個值是真的long long」。還有ull(或ULL)後綴,它用於unsigned long long。另請注意,C語言標準保證long long至少爲64位。

+0

爲了便於閱讀,請使用1024LL而不是102411。而「long long」必須至少爲64位;它不值得擔心它可能不會。 –