看CSAPP講解移位操作的時(shí)候,突然想起了以前曾經(jīng)遇到的一個(gè)詭異問(wèn)題:
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才對(duì)。后來(lái)到網(wǎng)上查閱了一下,原來(lái)在C99標(biāo)準(zhǔn)中規(guī)定如果移位操作的位數(shù)大于等于位寬那么結(jié)果是未定義的。這句話居然在K & R的著作中就有提到,實(shí)在是牛。
這段代碼實(shí)際執(zhí)行的時(shí)候,據(jù)說(shuō)硬件會(huì)自動(dòng)對(duì)字長(zhǎng)取模,因此可以認(rèn)為值沒(méi)有改變。當(dāng)然,如果換一種寫法:
#include <iostream>
using namespace std;
int main()
{
int i = 10 >> 32;
printf("%d\n", i);
return 0;
}
這樣輸出就是零了,但是有編譯警告,看來(lái)編譯器的想法和一般的想法是一樣的,呵呵。
posted on 2009-12-03 09:31
sdfond 閱讀(351)
評(píng)論(2) 編輯 收藏 引用 所屬分類:
Reading Notes