Perché il seguente codice emette y > x quando chiaramente 1 > -1?
unsigned x=1;
signed char y=-1;
if(x>y){
printf("x>y");
}
else {
printf("y>x");
}
Spiega questo risultato.
La conversione del tipo implicito ti sta mordendo. Poiché x
non è firmato, y
viene convertito anche in unsigned; poiché -1 non si adatta a un carattere unsigned char, esso trabocca e diventa 255 (l'equivalente di char unsigned bit-bit di -1), che ovviamente è maggiore di -1.
La risposta di @tdammers è corretta, lasciami espandere un po '.
La rappresentazione binaria per i valori negativi presuppone che il bit più alto abbia il valore di 1
. Ad esempio, tutti i valori negativi a 8 bit assomigliano a 1xxx xxxx
.
Il valore a 8 bit per -1
è 1111 1111
.
Quindi, lo stesso% binario% co_de per unsigned è 1111 1111
. Pertanto, lo stesso valore binario può essere interpretato in due modi diversi , a seconda che sia firmato o meno.
Nel tuo caso, come notato da @tdammers, la tua 255
è memorizzata nella variabile firmata , ma interpretata implicitamente come non firmata . Ovviamente, -1
, da cui il risultato.
P.S. Dovresti sempre controllare gli avvertimenti del compilatore. Tutti i compilatori moderni sollevano un avvertimento in merito.
Questo è un caso in cui si spera che si ottenga un avvertimento del compilatore sulla combinazione di un valore firmato e non firmato. Potrebbe essere ancora più specifico dove si parla di un lvalue senza segno e di un rvalore firmato.
Questo esempio sottolinea i rischi di C e in misura minore, il C ++ (che tende ad essere un po 'più severo riguardo al controllo dei tipi e che offre vari tipi di cast). Se vuoi scrivere codice C di buona qualità, diverse cose possono aiutarti:
Leggi altre domande sui tag c