C語言基礎

int 與 unsigned int 為32位元。下列何者依C語言的標準屬於未定義行為?

  1. Aunsigned int 變數的值為最大值4294967295時,再加1
  2. B以 >> 把 int 的負值右移1位元
  3. Cint 變數的值為最大值2147483647時,再加1
查看答案與解析

正確答案:C. int 變數的值為最大值2147483647時,再加1

像 int 的 2147483647 + 1 這樣,有號整數運算的結果超出可表示的範圍,屬於未定義行為。無號整數的運算規定會回到除以 2³² 的餘數,因此 4294967295 + 1 為0,不是未定義行為。負值的右移是由處理系統決定為算術移位或邏輯移位的實作定義行為,gcc 採用算術移位。另一方面,負值的左移是未定義行為。

  • A. 無號運算規定溢位時會回到0的一側,結果為0。
  • B. 負值的右移是實作定義行為,不是未定義行為。
  • C. 正確。有號整數溢位是未定義行為。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. 以 gcc 啟用最佳化來編譯上方的函式時,if (p == NULL) 的判斷可能被刪除。其理由為下列何者?
  2. C語言的標準中,關於 int 型別的大小有何規定?下列何者正確?
  3. 在嵌入式程式中,存放32位元周邊暫存器值的變數,常以 stdint.h 的 uint32_t 宣告,而不是 unsigned int。主要理由為下列何者?
  4. 執行上方含有整數除法的程式碼時的輸出,下列何者正確?
  5. 執行上方使用前置與後置 ++ 的程式碼時的輸出,下列何者正確?