2013-04-12 55 views
12

假設long long是8字節,但是我得到整數溢出?

long long b = 5*1024*1024*1024; // 5 gigs, small enough for 64 bits 
    printf ("%lu\n",sizeof(long long)); // prints 8 (bytes) = 64 bits 

但是編譯器會抱怨:

warning: integer overflow in expression [-Woverflow] 

爲什麼會溢出,我失去了什麼?

回答

19

由於右邊的數字是int而不是long long,所以int算術在表達式中執行,導致溢出。

如果您將LL添加到其中一個,它會將它們全部提升。

+0

darn,你說得對。一個人總是會考慮追加f或者(cast)浮動......但是永遠不會持久::(欣賞它 –

+0

@DervinThunk - 用常量很容易忘記 – teppic

+0

更確切地說,常量的類型爲'int'(「integer」一個更通用的術語,涵蓋從'char'到'long long'的所有內容以及可能更多)。如果將LL'應用於最右邊的'1024',仍可能發生溢出;給定'5 * 1024 * 1024 * 1024LL','5 * 1024 * 1024'仍然被認爲是一個'int' - 它可以合法地縮小到16位。最可靠的解決方案可能是編寫'5LL * 1024LL * 1024LL * 1024LL' - 或'5LL *(1LL << 30)'。 –

相關問題