我编写了这个小程序,目的只是为了了解如何在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吗?

最佳答案

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

int的负值到unsigned int的转换也是明确定义的:n以模数UINT_MAX+1环绕。在具有32位int的典型系统上,UINT_MAX == 4294967295

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

我认为您的2147283747是2147483647的错字?

07-28 01:35
查看更多