C中这种逻辑转换的错误是什么

时间:2014-07-01 05:27:05

标签: c bit-manipulation

我制作这个小程序只是为了了解如何在C中进行逻辑移位。

#include <stdio.h>

int main (void)
{
    int n=-2,t;
    t = (int)((unsigned int)n >> 1);
    printf("%d\n",t);
    return 0;
}

然而,它输出
    2147283747。 我在这里错过了什么吗?难道答案不应该是7?

1 个答案:

答案 0 :(得分:7)

在C中,非负整数值的右移(无符号类型的任何值,或有符号类型的任何非负值)被定义为整数除以2.

intunsigned int的负值转换也是明确定义的:n包围模UINT_MAX+1。在具有32位int的典型系统上,UINT_MAX == 4294967295

所以(unsigned int)n4294967294。执行右移是2除以2147483647。由于这是有效的int,转换为int会使值保持不变,这应该是您所看到的。

我认为您的2147283747是2147483647的拼写错误?