在C中这种逻辑转换有什么问题

use*_*242 2 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;
}
Run Code Online (Sandbox Code Playgroud)

但是,它输出
2147283747.我在这里遗漏了什么吗?答案不应该是7?

M.M*_*M.M 7

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

从负值转换intunsigned int也是良好定义:n围绕模包裹UINT_MAX+1.在具有32位int的典型系统上,UINT_MAX == 4294967295.

所以(unsigned int)n4294967294.执行右移就是除以2,给予2147483647.由于这是有效的int,转换为int保持值不变,这应该是你看到的.

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