随笔 - 68  文章 - 57  trackbacks - 0
<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

常用链接

留言簿(8)

随笔分类(74)

随笔档案(68)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

  看CSAPP讲解移位操作的时候,突然想起了以前曾经遇到的一个诡异问题:
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int i = 10, d = 32;
 7 
 8     printf("%d\n", i >> d);
 9 
10     return 0;
11 }
12 

  这里输出仍然是10。一直不理解为什么是这样,正常理解输出是0才对。后来到网上查阅了一下,原来在C99标准中规定如果移位操作的位数大于等于位宽那么结果是未定义的。这句话居然在K & R的著作中就有提到,实在是牛。
  这段代码实际执行的时候,据说硬件会自动对字长取模,因此可以认为值没有改变。当然,如果换一种写法:
#include <iostream>
using namespace std;

int main()
{
    
int i = 10 >> 32;

    printf(
"%d\n", i);

    
return 0;
}

  这样输出就是零了,但是有编译警告,看来编译器的想法和一般的想法是一样的,呵呵。

posted on 2009-12-03 09:31 sdfond 阅读(334) 评论(2)  编辑 收藏 引用 所属分类: Reading Notes

FeedBack:
# re: 关于移位操作[未登录] 2009-12-03 10:30 Robin
有空我也要重读了。上次没坚持到最后。  回复  更多评论
  
# re: 关于移位操作 2009-12-06 11:00 sdfond
@Robin
恩,这书不错,就是太厚了,全读完真不容易...  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理