2012-06-30 12 views
7

考慮下面的代碼:C標準中有關偏移比位寬的更多位的說法是什麼?

int i = 3 << 65; 

我希望的結果是i==0,但實際的結果是i==6。對於某些測試中,我發現,用下面的代碼:的ab

int i, s; 
int a = i << s; 
int b = i << (s & 31); 

的值總是相同的。

C標準是否會說有關移位超過32位(類型爲int的寬度)的內容還是這種未指定的行爲?

回答

12

從我WG12/N1124草案(標準,但好夠我),還有在6.5.7 按位移位運算符以下塊:

如果右邊的值操作數爲負數或者大於或等於提升的左操作數的寬度,則行爲不確定。

因此,undefined。小心。

+0

「對我來說足夠好」 - 對每個人都足夠好,因爲標準包含完全相同的語言。 :-)請注意,您也可以從http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf免費獲得C99 + TC3,並且它也具有相同的語言,所以即使你沒有標準本身,你可以很確定它說什麼! –

+3

您還可以在這裏獲得一個更加方便讀者的html版本:http://port70.net/~nsz/c/c99/n1256.html –

+0

@R ..,哦,謝謝,那樣會更容易閱讀比PDF。 :) – sarnold