C言語の基礎
uint8_t a = 0x0F;
if (~a == 0xF0)
printf("equal\n");
else
printf("not equal\n");uint8_t は8ビットの符号なし整数型、int は32ビットとする。上のコードを実行したときの結果として、正しいものはどれか。
- Aequal と表示される
- Buint8_t の値には ~ を使えないので、コンパイルエラーになる
- Cnot equal と表示される
答えと解説を見る
正解:C. not equal と表示される
~a を計算する前に、a は整数拡張によって int の 0x0000000F に変換されます。そのため ~a は8ビットの 0xF0 ではなく、32ビットの 0xFFFFFFF0(int としては −16)になり、0xF0(240)とは等しくありません。8ビットで比べたい場合は、(uint8_t)~a == 0xF0 のように8ビットの型に戻してから比べます。レジスタの値を反転して比べる処理で起こりやすい誤りです。
- A. ~a は int で計算されて 0xFFFFFFF0 になるので、0xF0 とは等しくなりません。
- B. ~ は uint8_t の値にも使えます。値は int に変換されてから反転されます。
- C. 正しい。~a は 0xFFFFFFF0(−16)になり、0xF0 と等しくありません。