我做了这个小程序只是想知道如何在C中进行逻辑移位.
#includeint 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的拼写错误?