Le regole di costante intera in C è che una costante intera decimale ha il primo tipo in cui può essere rappresentato al: int
, long
, long long
.
2147483648
non rientra in un int
nel vostro sistema (come il massimo int
nel vostro sistema è 2147483647
) per cui il suo tipo è un long
(o un long long
a seconda del sistema). Quindi stai calcolando sizeof (long)
(o sizeof (long long)
a seconda del tuo sistema).
2147483647
è un int
nel vostro sistema e se si aggiunge a un 1
int
è ancora un int
. Quindi stai calcolando sizeof (int)
.
noti che sizeof(2147483647+1)
invoca un comportamento indefinito nel vostro sistema come INT_MAX + 1
overflow e firmato integer overflow è un comportamento indefinito in C.
notare che, mentre generalmente 2147483647+1
invoca un comportamento indefinito nel vostro sistema (INT_MAX + 1
overflow e integer overflow firmati è un comportamento non definito in C), sizeof(2147483647+1)
non richiama il comportamento non definito poiché l'operando di sizeof
in questo caso non viene valutato.
Perché stai facendo questo in primo luogo –
possibile duplicato di [Perché è "int i = 2147483647 + 1;" OK, ma "byte b = 127 + 1;" non è compilabile?] (http://stackoverflow.com/questions/6889176/why-is-int-i-2147483647-1-ok-but-byte-b-127-1-is-not-compilable) – GSerg
' 2147483647 + 1' è un'espressione che ha due operandi 'int' quindi il risultato è un' int' (e ha un comportamento non definito a causa dell'overflow). Allo stesso modo, '-2147483648' è un'espressione in cui' 2147483648' è un 'long int' che quindi ha l'operatore meno unario ad esso applicato, –