2015-08-12 26 views
6
#include <stdio.h> 
main() 
{ 
    if (sizeof(int) > -1) 
     printf("True"); 
    else 
     printf("False"); 
} 

RISPOSTA:c lingua se dichiarazione con sizeof

False

ma secondo la logica sizeof(int) ritorno 2 e if(2>-1) ritorno 1 e dovrebbe stampare Vero.

Perché si comporta diversamente?

+4

Questo probabilmente sarebbe stato catturato se avessi attivato più avvisi. – VoidStar

risposta

14

Prima di tutto, il valore prodotto da sizeof è di size_t di tipo unsigned. NOTA

Come il tipo unsigned è superiore rango rispetto al tipo signed, durante l'esecuzione del confronto, secondo le norme del gestore relazione, vengono eseguite le usuali conversioni aritmetiche, cioè del tipo firmata viene promosso tipo senza segno.

Nel tuo caso, il -1, se considerato come unsigned, rappresentano il valore più alto possibile unsigned, in tal modo, non c'è da meravigliarsi

if (sizeof(int) > -1) 

Viene posto a falso.

Morale della favola: Tentativo confronto tra un signed ed un unsigned è previsto per produrre risultato strano, proprio come nel tuo caso. È necessario abilitare l'avviso del compilatore e provare a risolvere i problemi segnalati dal compilatore.


NOTA:

Da C11, capitolo §7.19, <stddef.h>,

size_t
che è il tipo unsigned intera del risultato dell'operatore sizeof.

2

sizeof è un operatore che restituisce la dimensione e il tipo di valore restituito è unsigned int. Poiché unsigned ha un rango più alto del tipo singed, -1 viene considerato come numero senza segno. -1 in questo caso viene considerato come 0xFFFF. Quindi if (sizeof(int) > 0XFFFF) viene valutato su false.

enter image description here

1

Se si scrive

if ((int)sizeof(int) > -1) 

si otterrà il risultato atteso che è True.

La dimensione operatoreof restituisce un valore di tipo size_t che corrisponde a un tipo di numero intero senza segno definito dall'implementazione.

Dalla C standard (6.5.3.4 Il sizeof e alignof operatori)

5 Il valore del risultato degli operatori è definito dall'implementazione, e il tipo (di tipo intero senza segno) è size_t, definito in (e altre intestazioni).

La posizione di size_t in ogni caso superiore o almeno uguale al rango di tipo int. Significa che quando il compilatore ha bisogno di determinare il tipo di un'espressione che converte operando ridurrà il rango al tipo dell'operando con rango più alto. Se gli operandi hanno lo stesso valore, ma un operando ha un tipo intero senza segno e altri ha un tipo intero con segno, il tipo comune è di tipo int unsigned.

Così nella condizione di if

if (sizeof(int) > -1) 

-1 è convertito in unsigned tipo intero size_t e grazie alla sua rappresentazione interna dove tutti i bit sono impostati a 1 è freater del valore di sizeof(int)

+0

In realtà, a causa del modo in cui lo standard specifica le conversioni da firmato a non firmato, la rappresentazione interna di un numero negativo non ha importanza ... '-1' converte allo stesso valore senza segno (valore massimo per il tipo senza segno) . – Dmitri