编译器:gcc version 3.4.6 20060404 (Red Hat 3.4.6-10)
int a=-1;
printf(“%x\n”, a);
a>>=1;
printf(“%x\n”, a);
a>>=1;
printf(“%x\n”, a);
一段示意代码,之前一直都认为输出应该是0xffffffff,0x7fffffff。
不过运行的结果却出乎意料,输出时0xffffffff,0xffffffff。
以前一直都很单纯的认为移位操作就是简单的移位操作,没有考虑太多。
gcc -S test.c
得到汇编,看到a>>1的操作是通过sarl ($rax),也就是说,对于int类型,gcc采用算术移位,其汇编代码如下:
sarl (%rax)
如果把int a改成unsigned int a,那么就会采用逻辑移位了,汇编代码如下:
shrl (%rax)
这么大的坑,标记一下。对于移位的操作,还是用无符号数,避免这个问题。
参考:
http://blog.csdn.net/lovekatherine/archive/2007/02/10/1506768.aspx