对有符号数的位移操作

来看代码

#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-…,这里有一些讨论

Leave a Reply

Your email address will not be published. Required fields are marked *