-1

我在 xcode 中运行了以下代码,令我惊讶的是答案是 256。由于 char 只有 8 位长,我预计它是 0。将 1 转储到 8 位。有人可以解释发生了什么吗?

int main()
{
    unsigned char i = 0x80;
    printf("%d\n", i<<1);
    return 0;
}
4

3 回答 3

1

它被提升为一个整数,它可以包含256刚刚好的值。强制转换unsigned char将为您提供预期的结果:

printf("%d\n", (unsigned char)(i<<1) );
于 2013-07-18T15:03:01.607 回答
1

当你这样做时,它被提升为整数i << 1。例如,SHL在 x86 中处理 32 位字(即使您的 c 类型是 8 位),所以移位的位不会从 32 位寄存器中丢弃。当您使用 with 打印此区域时"%d",您会得到256. 如果你想用左移unsigned char,你总是可以做到(i << x) & 0xff的。

于 2013-07-18T15:02:05.700 回答
0

在这种情况下,发生的情况是 的中间结果i<<1是一个整数,可以表示 256。

于 2013-07-18T15:02:12.863 回答