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. Aa < b と表示される
  2. Ba >= 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言語の基礎の参考書を探す PR

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

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

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