Este es un resultado de C de reglas enteras de promoción. Esencialmente, la mayoría de las variables que entran en una expresión se "promueven" para que las operaciones de este tipo no pierdan precisión. Luego, se pasa como int
a printf
, según las reglas de argumentos variables de C.
Si te gustaría lo que está buscando, usted tendría que emitir de nuevo a unsigned char
:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",((unsigned char)(i<<1)));
return 0;
}
Nota: el uso de %c
como se especifica en el comentario de Stephen no funcionará porque %c
espera una entero también
EDIT: Como alternativa, se podría hacer esto:
#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;
}
no quiero publicar como una respuesta porque no estoy 100% seguro, pero no es porque% d es un número entero? Por lo tanto, el código detrás de las escenas probablemente asigna 'i << 1' a un número entero para imprimirlo, lo que significa que se ajusta y no se desborda. Intenta hacer 'printf ("% c ", i << 1);'? – Stephen
@Stephen: Debería haber publicado la respuesta;) – KevenK
@Stephen: La salida está en blanco cuando uso% c. – Variance