#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",i<<1);
return 0;
}
为什么这个程序打印 256?
据我了解,由于 0x80= 0b10000000,并且 unsigned char 有 8 位,左移后“1”应该溢出,输出应该是 0,而不是 256。
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",i<<1);
return 0;
}
为什么这个程序打印 256?
据我了解,由于 0x80= 0b10000000,并且 unsigned char 有 8 位,左移后“1”应该溢出,输出应该是 0,而不是 256。
这是 C 的整数提升规则的结果。本质上,大多数进入表达式的变量都是“提升”的,这样这样的操作就不会失去精度。然后,根据 C 的变量参数规则,它作为int
into传递。printf
如果你想要你正在寻找的东西,你必须回溯到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;
}
不要忘记专门用于打印未签名的格式。
printf("%u",(unsigned char)(i<<1));