我在xcode中运行了以下代码,令我惊讶的是答案是256。 由于char只有8位长,我预计这将是0。 将8中的1个倾倒。 有人可以解释发生了什么吗?
int main()
{
unsigned char i = 0x80;
printf("%d\n", i<<1);
return 0;
}
答案 0 :(得分:1)
执行i << 1
时,它会被提升为整数。例如,SHL
在x86中对32位字(即使c类型为8位)起作用,因此移位的位不会从32位寄存器中丢弃。当您使用"%d"
打印此区域时,您会获得256
。如果您想使用unsigned char
左移,您可以随时(i << x) & 0xff
。
答案 1 :(得分:1)
它被提升为一个整数,可以包含256
的值就好了。对unsigned char
的强制转换会为您提供预期的结果:
printf("%d\n", (unsigned char)(i<<1) );
答案 2 :(得分:0)
在这种情况下,发生的事情是i<<1
的中间结果是一个整数,可以表示256。