2015-06-21 50 views
14
#include<stdio.h> 

int main() 
{ 
    printf("%d\n", sizeof(2147483648)); 
    printf("%d" , sizeof(2147483647+1)); 
    return 0; 
} 

輸出:的sizeof(2147483648)是8個字節,而的sizeof(2147483647 + 1)爲4個字節

8 
4 

我明白sizeof(2147483648)是因爲它可以不適合在4個字節的8個字節,並提升爲long long int。但我不明白會發生什麼情況sizeof(2147483647+1)

我發現similar question但它沒有討論第二種情況。

+3

你爲什麼要這麼做首先 –

+0

可能的重複[爲什麼是「int i = 2147483647 + 1;」好的,但是「字節b = 127 + 1;」是不是compilable?](http://stackoverflow.com/questions/6889176/why-is-int-i-2147483647-1-ok-but-byte-b-127-1-is-not-compilable) – GSerg

+10

' 2147483647 + 1'是一個表達式,它具有兩個「int」操作數,所以結果是一個「int」(並且由於溢出而具有未定義的行爲)。同樣,'-2147483648'是一個表達式,其中'2147483648'是一個'long int',然後將一元減算子應用於它, –

回答

18

用C整數常數的規則是,一個十進制整數常數具有其中它可以被表示在第一類型:intlonglong long

2147483648 

不適合放入一個int到系統(如系統中的最大int2147483647),所以它的類型是long(或取決於系統上的long long)。所以你計算sizeof (long)(或sizeof (long long)取決於你的系統)。

2147483647 

是在你的系統中int,如果你添加1int它仍然是一個int。所以你計算sizeof (int)

注意sizeof(2147483647+1)在你的系統調用未定義行爲INT_MAX + 1溢出,並簽署整數溢出是C.不確定的行爲

注意的是,雖然一般2147483647+1調用系統中的未定義行爲(INT_MAX + 1溢出並簽署整數溢出在C中是未定義的行爲),sizeof(2147483647+1)不會調用未定義的行爲,因爲在這種情況下操作數sizeof未被評估。

+2

您確定這裏有未定義的行爲,因爲該表達式作爲'sizeof'的參數出現,而不是在它將被評估的上下文中? – Hurkyl

+3

我懷疑它會調用UB。 '2147483647 + 1'不會被評估。 – haccks

+1

可能相關:[不評估應用sizeof的表達式是否可以在C++中取消引用sizeof中的空指針或無效指針是合法的?](http://stackoverflow.com/q/28714018/11683)。 – GSerg

相關問題