C言語の基礎

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

uint8_t は8ビットの符号なし整数型、int は32ビットとする。上のコードを実行したときの結果として、正しいものはどれか。

  1. Aequal と表示される
  2. Buint8_t の値には ~ を使えないので、コンパイルエラーになる
  3. 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 と等しくありません。
この分野を解く 分野ページへ

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

C言語の基礎のほかの問題

  1. int と unsigned int は32ビットとする。上のコードを実行したときの結果として、正しいものはどれか。
  2. unsigned int は32ビットとする。上のコードを実行したときの動作として、正しいものはどれか。
  3. 「char c = 200;」とした c を printf の %d で表示するプログラムを、x86-64 の Linux 向けの gcc でコンパイルして実行すると −56、Arm の Linux 向けの gcc では 200 と表示された。違いが生じる理由として正しいものはどれか。
  4. && と || の右側に b++ を書いた上のコードを実行したときの出力として、正しいものはどれか。
  5. break のない case を含む上の switch 文を実行したときの出力として、正しいものはどれか。