2013-07-25 16 views
9

Ecco il mio codice problema:Il carattere non firmato c = 255 è "11111111" o no?

#include "stdio.h" 

int main() 
{ 
     char a = -1; 
     unsigned char b = 255; 
     unsigned char c = 0; 
     if((~a) == c) 
       printf("OK 1"); 
     else 
       printf("bad 1"); 
     printf("\n"); 
     if((~b) == c) 
       printf("OK 2"); 
     else 
       printf("bad 2"); 
     printf("\n"); 
} 

mi aspettavo questo da stampare:

OK 1 

OK 2 

Ma, ottengo OK 1 e cattivo 2!

Se unsigned char b è 255 (11111111), quindi ~ b deve essere 00000000. Perché non è uguale c?

Io lavoro su Linux SUSE, utilizzando gcc.

risposta

12

Sei morso da promozioni intere. Quando si esegue:

~b == c 

b e c sia ottenere una promozione a int. Ciò significa che si sta facendo davvero:

~0x000000ff == 0 

che finisce a confronto:

0xffffff00 == 0 

che non corrispondono. Funziona in vostro primo caso, perché il tipo di char è firmato, e viene segno su cui si estendeva nella promozione:

~a == c 
~(-1) == 0 
~0xffffffff == 0 
0 == 0 
+0

È possibile utilizzare il codice per la prova che? È difficile immaginare –

+5

* Il tuo * codice lo dimostra. È solo il modo in cui funziona C. –

+0

OK, hai ragione. –

2

A causa di promozioni integrali standard: Nell'espressione ~b, l'operando è promosso a int, che potrebbe essere qualcosa di come 0x000000FF; il risultato è il numero intero 0xFFFFFF00.

È necessario convertire il risultato torna a unsigned char:

if ((unsigned char)(~b) == c) /* ... */ 
+0

+1, ma i tipi di 'char' 4-bit non sono consentiti dallo standard. –

+0

Sì, funziona! Mi aspetto la stampa –

+0

@CarlNorum: Nella mia notazione, 'F' è il 256 ° simbolo :-) –

Problemi correlati