我制作这个小程序只是为了了解如何在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?
答案 0 :(得分:7)
在C中,非负整数值的右移(无符号类型的任何值,或有符号类型的任何非负值)被定义为整数除以2.
从int
到unsigned int
的负值转换也是明确定义的:n
包围模UINT_MAX+1
。在具有32位int的典型系统上,UINT_MAX == 4294967295
。
所以(unsigned int)n
是4294967294
。执行右移是2
除以2147483647
。由于这是有效的int
,转换为int
会使值保持不变,这应该是您所看到的。
我认为您的2147283747是2147483647的拼写错误?