Chinaunix首页 | 论坛 | 博客
  • 博客访问: 215664
  • 博文数量: 37
  • 博客积分: 3082
  • 博客等级: 中校
  • 技术积分: 387
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-14 13:59
文章分类
文章存档

2013年(1)

2012年(1)

2011年(2)

2010年(7)

2009年(1)

2008年(13)

2007年(12)

我的朋友

分类: LINUX

2010-11-24 15:25:30




编译器: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);

一段示意代码,之前一直都认为输出应该是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

阅读(1473) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~