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

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

uscita:sizeof (2147483648) è 8 byte mentre sizeof (2147483647 + 1) è 4 byte

8 
4 

comprendo che sizeof(2147483648) è di 8 byte come non può adattarsi a 4 byte e viene promosso long long int. Ma non capisco cosa succede in caso di sizeof(2147483647+1)

Ho trovato un similar question ma non discute il secondo caso.

+3

Perché stai facendo questo in primo luogo –

+0

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

+10

' 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, –

risposta

18

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 1int è 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.

+2

Sei sicuro che qui ci sia un comportamento indefinito, dato che l'espressione appare come un argomento di 'sizeof' piuttosto che in un contesto in cui verrebbe valutato? – Hurkyl

+3

Sospetto che invocherà UB. '2147483647 + 1' non sarà valutato. – haccks

+1

Possibilmente rilevante: [Non valutare l'espressione a cui sizeof è applicato, rendere legale il dereferenziamento di un puntatore nullo o non valido all'interno di sizeof in C++?] (Http://stackoverflow.com/q/28714018/11683). – GSerg