2013-10-17 44 views
3

昨晚的換檔操作使用變量,我的朋友告訴我的情況如下所示:錯誤發生時我用C

在C

/C++,我們寫兩個代碼是這樣的:

int a = 0; 
printf("%d\n", 1 << -1); 
printf("%d\n", 1 << (a-1)); 

令人驚訝的是有兩個不同的結果,以前是0,另一個是-2147483648。

我們不知道爲什麼,任何人都可以給我一個幫助。

歡迎任何單詞。

+0

這是不確定的行爲,這意味着_anything_可能發生,包括死機,得到印刷隨機的東西或出現才能正常工作程序。嘗試理解一旦調用未定義行爲時特定程序行爲的原因就毫無意義。 – Lundin

回答

7

在左移運算符的右側有一個負操作數是C中未定義的行爲。您不應該對這樣做的結果感到驚訝。

4

右側的帶符號整數在C語言中是未定義的行爲。

ISO 9899:1999§3

整數優惠在每個操作數的執行6.5.7逐位移位運算符。結果的類型爲 是提升的左操作數的類型。如果右邊操作數的值爲 ,或者大於或等於提升的左操作數的寬度 ,則行爲是未定義的。

0

如果移位表達式的右操作數爲負或者右操作數大於或等於(提升的)左操作數中的位數,結果是不確定的。如果右操作數爲零(0),則不執行移位操作。

Check this msdn link