C語言基礎
uint8_t a = 0x0F;
if (~a == 0xF0)
printf("equal\n");
else
printf("not equal\n");uint8_t 是8位元的無號整數型別,int 為32位元。執行上方程式碼時的結果,下列何者正確?
- A顯示 equal
- Buint8_t 的值不能使用 ~,因此發生編譯錯誤
- 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 不相等。