void main () {if (sizeof (int)> -1) printf (“true”); else printf (“false”); ;

void main() { if(sizeof(int) > -1) printf("true"); else printf("false"); } 

Mi aspettavo che l’output fosse vero ma è falso. Qualcuno può spiegarmi il motivo dell’output.

sizeof(int) è di tipo size_t , che è un tipo intero senza segno. Quindi nell’espressione if(sizeof(int) > -1) , -1 viene convertito in un numero intero senza segno, che è molto grande.

A proposito, usa int main invece del void main non standard.

sizeof (int) restituisce size_t che è come unsigned int .

Le conversioni aritmetiche usuali sono implicitamente eseguite per tipo comune.

 int --> unsigned int --> long --> unsigned long --> long long --> unsigned long long --> float --> double --> long double 

int value (-1) viene convertito in unsigned int come parte della conversione implicita.

-1 sarà rappresentato come 0xFFFF in una 16 bit machine(for example) a 16 bit machine(for example) .

Quindi l’espressione diventa,

 if(sizeof(int) > -1 ) ==> if(2 > 0xFFFF) 

E false è stampato. Suggerisco di provare if((int)sizeof(int) > -1 ) per il risultato corretto.

Il tipo di dati di valore fornito da sizeof è size_t che è (nella maggior parte delle macchine) un unsigned int/long , quindi, quando lo si confronta con -1 , -1 viene promosso a unsigned che diventa 0xFFF.. , che è il il più grande valore che può avere il tipo di dati, quindi il tuo confronto fallisce.