来看代码
#include <stdio.h> int main() { int a = 0x80000000; int b = a>>1; int c = a>>2; int d = a>>31; int e = a>>32; printf("%d\n%d\n%d\n%d\n%d\n", a, b, c, d, e); return 0; }
这个东西的输出是什么呢
vs2005 和 gcc 4.1.2 都是
-2147483648 -1073741824 -536870912 -1 -2147483648
为什么呢
首先,a 的值,是一个 32 位,最高位为 1,其余都为 0,那么打印出 -2147483648 不奇怪,但是,接下来的,b,我们把 a 右移一位,照理说,这个时候,应该是最高位为 0,然后次高位为 1,打印的应该是 1073741824,而实际上打出来的却是 -1073741824,那么说明,他的最高位和次高位都为 1 了,也就是说,符号位在位移的时候被保留了,嗯,这个也好吧,然后 c,这个的最高位,次高位,次次高位,都是 1,也就是说,就像移动的时候会复制一样,那么 d 就可以理解为什么会是 -1 了,因为比特位全部都是 1 了,但是,e 呢,这个其实在编译的时候有报警告,说行为未定义,但是按照之前的搞法,这个应该也是 -1 啊,不过六道轮回,这个又变成只有最高位为 1 了,真是一个神奇的世界。
http://www.cnblogs.com/weiweis…,http://blog.chinaunix.net/uid-…,这里有一些讨论