看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