C語言基礎

uint8_t a = 0x0F;
if (~a == 0xF0)
    printf("equal\n");
else
    printf("not equal\n");

uint8_t 是8位元的無號整數型別,int 為32位元。執行上方程式碼時的結果,下列何者正確?

  1. A顯示 equal
  2. Buint8_t 的值不能使用 ~,因此發生編譯錯誤
  3. C顯示 not equal
查看答案與解析

正確答案:C. 顯示 not equal

在計算 ~a 之前,a 會因整數提升而轉換為 int 的 0x0000000F。因此 ~a 不是8位元的 0xF0,而是32位元的 0xFFFFFFF0(以 int 而言是 −16),與 0xF0(240)不相等。若要以8位元比較,應先轉回8位元的型別,例如 (uint8_t)~a == 0xF0。這是把暫存器的值反轉後再比較時容易發生的錯誤。

  • A. ~a 以 int 計算而成為 0xFFFFFFF0,因此與 0xF0 不相等。
  • B. uint8_t 的值也能使用 ~。值會先轉換為 int 再反轉。
  • C. 正確。~a 成為 0xFFFFFFF0(−16),與 0xF0 不相等。
練習這個領域 前往領域頁面

C語言基礎的其他題目

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