Это результат целочисленных правил продвижения C.По сути, большинство любых переменных, входящих в выражение, «продвигаются», так что подобные операции не теряют точности.Затем он передается как int
в printf
, в соответствии с правилами переменных аргументов C.
Если вы хотите получить то, что ищете, вам придется вернуться к unsigned char
:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",((unsigned char)(i<<1)));
return 0;
}
Примечание: использование %c
, как указано в комментарии Стивена, не будет работать, потому что %c
также ожидает целое число.
РЕДАКТИРОВАТЬ: В качестве альтернативы, вы можете сделать это:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
unsigned char res = i<<1;
printf("%d",res);
return 0;
}
или
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",(i<<1) & 0xFF);
return 0;
}