Ceci est le résultat de C de règles de promotion d'entiers. Essentiellement, la plupart des variables entrant dans une expression sont "promues" de sorte que les opérations comme celle-ci ne perdent pas de précision. Ensuite, il est passé comme int
en printf
, selon les règles d'arguments variables de C.
Si vous voulez ce que vous cherchez, vous devriez jeter revenir à unsigned char
:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",((unsigned char)(i<<1)));
return 0;
}
Note: L'utilisation %c
comme indiqué dans le commentaire de Stephen ne fonctionnera pas parce que %c
attend une entier aussi.
EDIT: Alternativement, vous pouvez le faire:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
unsigned char res = i<<1;
printf("%d",res);
return 0;
}
ou
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",(i<<1) & 0xFF);
return 0;
}
Vous ne voulez pas poster comme réponse parce que je ne suis pas sûr à 100%, mais n'est-ce pas parce que% d est un nombre entier? Ainsi, le code derrière les scènes assigne probablement 'i << 1' à un entier pour l'imprimer, ce qui signifie qu'il s'adapte et ne déborde pas. Essayez de faire 'printf ("% c ", i << 1);'? – Stephen
@Stephen: Doit avoir posté la réponse;) – KevenK
@Stephen: La sortie est vide lorsque j'utilise% c. – Variance