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;
}
fonte
2010-07-30 16:51:49
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
@Stephen: avrebbe dovuto inviare la risposta;) – KevenK
@Stephen: l'output è vuoto quando utilizzo% c. – Variance