2010-07-30 17 views
8
#include <stdio.h> 
int main() 
{ 
    unsigned char i=0x80; 
    printf("%d",i<<1); 
    return 0; 
} 

Perché questo programma stampa 256?Valore massimo di unsigned char

Come comprendo questo, poiché 0x80 = 0b10000000 e unsigned char è 8 bit, il '1' deve fuoriuscire dopo spostamento a sinistra e l'uscita dovrebbe essere 0, non 256.

+2

Non voglio postare una risposta perché non sono sicuro al 100%, ma non è vero perché% d è un intero? Quindi, il codice dietro le quinte probabilmente assegna 'i << 1' a un numero intero per stamparlo, il che significa che si adatta e non trabocca. Prova a fare 'printf ("% c ", i << 1);'? – Stephen

+0

@Stephen: avrebbe dovuto inviare la risposta;) – KevenK

+0

@Stephen: l'output è vuoto quando utilizzo% c. – Variance

risposta

14

Questo è il risultato della funzione C regole di promozione intera. In sostanza, la maggior parte delle variabili che entrano in un'espressione viene "promossa" in modo che operazioni come questa non perdano la precisione. Quindi, viene passato come int in printf, in base alle regole degli argomenti variabili di C.

Se ci si vuole quello che stai cercando, avrebbe dovuto lanciare di nuovo a unsigned char:

#include <stdio.h> 
int main() 
{ 
    unsigned char i=0x80; 
    printf("%d",((unsigned char)(i<<1))); 
    return 0; 
} 

Nota: usando %c come specificato nel commento di Stephen non funzionerà perché si aspetta un %c anche intero.

EDIT: In alternativa, si potrebbe fare questo:

#include <stdio.h> 
int main() 
{ 
    unsigned char i=0x80; 
    unsigned char res = i<<1; 
    printf("%d",res); 
    return 0; 
} 

o

#include <stdio.h> 
int main() 
{ 
    unsigned char i=0x80; 
    printf("%d",(i<<1) & 0xFF); 
    return 0; 
} 
+0

Puoi trasmettere '(i << 1)' a 'carattere non firmato '? – nmichaels

+0

@Nathon: non è quello che ho fatto? –

+1

Strano, devo avere i miei paraocchi accesi. – nmichaels

0

non dimenticare il formato specifico per la stampa senza segno.

printf("%u",(unsigned char)(i<<1)); 
+0

A causa delle regole di promozione di C, molto probabilmente l'argomento verrà passato a' printf' come 'signed int', non' unsigned '. Dovresti trasmettere l'argomento a un tipo che corrisponde allo specificatore di formato. –

Problemi correlati