C語言基礎
int 與 unsigned int 為32位元。下列何者依C語言的標準屬於未定義行為?
- Aunsigned int 變數的值為最大值4294967295時,再加1
- B以 >> 把 int 的負值右移1位元
- Cint 變數的值為最大值2147483647時,再加1
查看答案與解析
正確答案:C. int 變數的值為最大值2147483647時,再加1
像 int 的 2147483647 + 1 這樣,有號整數運算的結果超出可表示的範圍,屬於未定義行為。無號整數的運算規定會回到除以 2³² 的餘數,因此 4294967295 + 1 為0,不是未定義行為。負值的右移是由處理系統決定為算術移位或邏輯移位的實作定義行為,gcc 採用算術移位。另一方面,負值的左移是未定義行為。
- A. 無號運算規定溢位時會回到0的一側,結果為0。
- B. 負值的右移是實作定義行為,不是未定義行為。
- C. 正確。有號整數溢位是未定義行為。