C語言基礎

int a = -1;
unsigned int b = 1;
if (a < b)
    printf("a < b\n");
else
    printf("a >= b\n");

int 與 unsigned int 為32位元。執行上方程式碼時的結果,下列何者正確?

  1. A顯示 a < b
  2. B顯示 a >= b
  3. C有號與無號的值無法比較,因此發生編譯錯誤
查看答案與解析

正確答案:B. 顯示 a >= b

比較 int 與 unsigned int 時,兩者會先統一為 unsigned int 再比較(一般算術轉換)。−1 以 unsigned int 表示時是 2³² − 1 = 4294967295,比1大,因此 a < b 為偽。所以顯示「a >= b」。對於混合有號與無號的比較,gcc 加上 -Wextra(或 -Wsign-compare)時會發出警告。

  • A. a 被轉換為 unsigned int 而成為4294967295,因此不會小於1。
  • B. 正確。−1 先被轉換為4294967295再比較。
  • C. 可以比較,會先把兩者統一為 unsigned int 再比較。
練習這個領域 前往領域頁面

C語言基礎的其他題目

  1. unsigned int 為32位元。執行上方程式碼時的動作,下列何者正確?
  2. 設定「char c = 200;」並以 printf 的 %d 顯示 c 的程式,以 x86-64 Linux 用的 gcc 編譯執行時顯示 −56,以 Arm Linux 用的 gcc 則顯示200。產生差異的理由為下列何者?
  3. 執行上方在 && 與 || 的右邊寫了 b++ 的程式碼時的輸出,下列何者正確?
  4. 執行上方含有沒有 break 之 case 的 switch 敘述時的輸出,下列何者正確?
  5. 執行上方程式時的輸出,下列何者正確?