Это является результатом Кассиопеяне целые правила продвижения. По существу, большая часть любой переменной, входящей в выражение, «продвигается», так что такие операции не теряют точность. Затем он передается как int
в printf
, в соответствии с правилами переменных аргументов C.
Если вы хотите, что вы ищете, вы должны были бы бросить обратно unsigned char
:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",((unsigned char)(i<<1)));
return 0;
}
Примечание: с помощью %c
, как указано в комментарии Стефана не будет работать, потому что %c
ожидает целое число.
EDIT: Кроме того, вы можете сделать это:
#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;
}
Не хотите публиковать как ответ, потому что я не уверен на 100%, но разве это не потому, что% d является целым числом? Таким образом, код за кулисами, вероятно, присваивает 'i << 1' целому числу для его печати, что означает, что он подходит и не переполняется. Попробуйте сделать 'printf («% c », i << 1);'? – Stephen
@ Stephen: Должен был отправить ответ;) – KevenK
@Stephen: Выход пустой, когда я использую% c. – Variance