#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",i<<1);
return 0;
}
为什么这个程序打印256?
据我所知,由于0x80 = 0b10000000,无符号字符有8位,因此左移后'1'应溢出,输出应为0,而不是256。
答案 0 :(得分:14)
这是C的整数提升规则的结果。从本质上讲,进入表达式的大多数变量都是“提升”的,因此这样的操作不会失去精度。然后,根据C的变量参数规则,它作为int
传递到printf
。
如果你想要你想要的东西,你必须回到unsigned char
:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",((unsigned char)(i<<1)));
return 0;
}
注意:使用Stephen注释中指定的%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;
}
答案 1 :(得分:0)
不要忘记专门用于打印未签名的格式。
printf("%u",(unsigned char)(i<<1));