昨晚的換檔操作使用變量,我的朋友告訴我的情況如下所示:錯誤發生時我用C
在C/C++,我們寫兩個代碼是這樣的:
int a = 0;
printf("%d\n", 1 << -1);
printf("%d\n", 1 << (a-1));
令人驚訝的是有兩個不同的結果,以前是0,另一個是-2147483648。
我們不知道爲什麼,任何人都可以給我一個幫助。
歡迎任何單詞。
昨晚的換檔操作使用變量,我的朋友告訴我的情況如下所示:錯誤發生時我用C
在C/C++,我們寫兩個代碼是這樣的:
int a = 0;
printf("%d\n", 1 << -1);
printf("%d\n", 1 << (a-1));
令人驚訝的是有兩個不同的結果,以前是0,另一個是-2147483648。
我們不知道爲什麼,任何人都可以給我一個幫助。
歡迎任何單詞。
在左移運算符的右側有一個負操作數是C中未定義的行爲。您不應該對這樣做的結果感到驚訝。
右側的帶符號整數在C語言中是未定義的行爲。
ISO 9899:1999§3
整數優惠在每個操作數的執行6.5.7逐位移位運算符。結果的類型爲 是提升的左操作數的類型。如果右邊操作數的值爲 ,或者大於或等於提升的左操作數的寬度 ,則行爲是未定義的。
如果移位表達式的右操作數爲負或者右操作數大於或等於(提升的)左操作數中的位數,結果是不確定的。如果右操作數爲零(0),則不執行移位操作。
這是不確定的行爲,這意味着_anything_可能發生,包括死機,得到印刷隨機的東西或出現才能正常工作程序。嘗試理解一旦調用未定義行爲時特定程序行爲的原因就毫無意義。 – Lundin