linux开发专注者(坚持原创)linuxfocus.blog.chinaunix.net

多阅读,多思考,多实践,多分享!

  • 博客访问: 5181578
  • 博文数量: 238
  • 博客积分: 10424
  • 博客等级: 少将
  • 技术积分: 14180
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-14 12:45
  • 认证徽章:
个人简介

啦啦啦~~~

文章分类

全部博文(238)

文章存档

2015年(5)

2014年(2)

2013年(22)

2012年(67)

2011年(120)

2010年(22)

微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

订阅
热词专题

分类: C/C++

作者:gfree.wind@gmail.com
博客:blog.focus-linux.net     linuxfocus.blog.chinaunix.net

话说有这样的一段代码:
  1. #include <stdlib.h>
  2. #include <stdio.h>


  3. static void divide_by_two(int num)
  4. {
  5.     while (num) {
  6.         printf("%d\n", num);
  7.         num /= 2;
  8.     }
  9. }

  10. int main()
  11. {
  12.     int num;
  13.     scanf("%d", &num);

  14.     divide_by_two(num);

  15.     return 0;
  16. }
某天,一个刚毕业的朋友——没有贬低应届生的意思哦~~~,开始负责维护这段代码。他呢,看到num /= 2,想起课程上讲过,整数右移一位,就等于除于二,并且右移操作比除法运算要高效的多。于是将 num /=2 改为了 num = num>>1。

代码变为
  1. #include <stdlib.h>
  2. #include <stdio.h>


  3. static void divide_by_two(int num)
  4. {
  5.     while (num) {
  6.         printf("%d\n", num);
  7.         num = num>>1;
  8.     }
  9. }

  10. int main()
  11. {
  12.     int num;
  13.     scanf("%d", &num);

  14.     divide_by_two(num);

  15.     return 0;
  16. }
编译成功后,当然不能忘了测试:
  1. [xxx@xxx-vm-fc13 test]$ ./a.out
  2. 10
  3. 10
  4. 5
  5. 2
  6. 1
  7. [xxx@xxx-vm-fc13 test]$ ./a.out
  8. 3
  9. 3
  10. 1
这位朋友对于结果很满意,于是将改动提交到了服务器,下班回家~~~

结果第二天就有同事来找他,说他的程序陷入了死循环:
  1. [xxx@xxx-vm-fc13 test]$ ./a.out
  2. -5
  3. -5
  4. -2
  5. -1
  6. -1
  7. -1
  8. 。。。。。。
  9. -1
这位朋友刚参加工作,第一次提交改动,就造成了这样的结果,自然很紧张。不是右移一位就等于除以2吗?究竟是怎么回事呢?虽然暂时不知道答案,也只能将改动rollback回去。

那么到底是什么原因呢?没错,右移一位就等于除以2,但是这里需要加一个条件,这里指的是正数。而对于有符号整数,且其值为负数时,在C99标准中对于其右移操作的结果的规定是implementation-defined.

在Linux上的GCC实现中,有符号数的右移操作的实现为使用符号位作为补充位。因此-1的右移操作仍然为0xFFFFFFFF。这导致了死循环。

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

zyd_cu2013-10-16 13:57:26

gfree_wind:我自己都没有注意到这个阅读数。。。。。

居然这样的文章占了2/3,为啥啊,想不明白。。。。

难道是被某热心网友刷上去的?

回复 | 举报

gfree_wind2013-10-15 20:49:41

zyd_cu:这篇文章的阅读数1024464,太霸气了 占这个站点的2/3

我自己都没有注意到这个阅读数。。。。。

居然这样的文章占了2/3,为啥啊,想不明白。。。。

回复 | 举报

zyd_cu2013-10-14 19:59:24

这篇文章的阅读数1024464,太霸气了 占这个站点的2/3

Heartwork2012-01-23 20:31:02

逻辑右移或者算数右移确实依赖具体实现。比较稳妥的做法是提高优化级别,由编译器搞定。

conceptcon2012-01-07 14:20:12

评论热议
请登录后评论。

登录 注册