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