看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 閱讀(349)
評論(2) 編輯 收藏 引用 所屬分類:
Reading Notes