我编写了这个小程序,目的只是为了了解如何在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)n
是4294967294
。在此除以2
的同时执行右移,得到2147483647
。由于这是有效的int
,因此转换为int
的值将保持不变,这应该是您看到的。
我认为您的2147283747是2147483647的错字?