C中的右移运算符?

时间:2012-03-03 14:21:45

标签: c bit-shift

我收到了以下代码:

int main(int argc, char *argv[])
{
    char c = 128;

    c = c >> 1;

    printf("c = %d\n", c);

    return 0;
}

在win xp 32位上运行上面的代码,我得到了结果:-64。为什么-64

4 个答案:

答案 0 :(得分:9)

因为char类型是带符号的8位整数(在您正在使用的C的实现中)。如果您尝试将值128存储在其中,它实际上将是-128。

这个位将是:

10000000

移动负数将保持符号位设置(因为您的实现使用算术移位):

11000000

结果是-64。

答案 1 :(得分:3)

C标准未指定char是有符号还是无符号。在这种情况下,它看起来像是一个签名的char,范围从-128到+127。为它分配128会滚动并离开-128,因此c>> 1是-64。

如果您将c指定为“unsigned char”,则c>> 1将为64。

正如评论所说,标准未定义右移一个负值,所以它只是运气,它是-64。

答案 2 :(得分:0)

变量c已签名。将声明更改为unsigned char c ...将产生64的结果

答案 3 :(得分:0)

您使用的是默认情况下已签名的char类型。签名char的范围是-128到127.这意味着char c = 128确实将c设置为-128。 (这是因为大多数处理器使用两个补码来表示负数)因此当你向右移动时你得到-64。

最重要的是,在进行位操作时,使用无符号类型来获得预期的结果。