C言語の基礎

uint8_t x = 250;
for (int i = 0; i < 10; i++)
    x++;
printf("%d\n", x);

uint8_t は8ビットの符号なし整数型である。x を10回増やす上のコードを実行したときの出力として、正しいものはどれか。

  1. A4
  2. B255
  3. C260
答えと解説を見る

正解:A. 4

uint8_t で表せるのは0〜255です。符号なしの整数型に入らない値は、2⁸ = 256 で割った余りの値になると規格で決まっているので、250から1ずつ増やすと、255の次は0に戻ります。10回増やすと、250 + 10 = 260 を256で割った余りの4になります。これに対して、符号付きの整数型の計算のあふれは未定義動作です。

  • A. 正しい。260を256で割った余りの4になります。
  • B. 最大値の255で止まる(飽和する)と考えた場合の値です。符号なしの整数型は0の側に戻ります。
  • C. あふれを考えずに250に10を足した値です。uint8_t には256以上の値は入りません。
この分野を解く 分野ページへ

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

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

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

  1. unsigned char は8ビット、int は32ビットとする。上のコードを実行したときの出力として、正しいものはどれか。
  2. uint8_t は8ビットの符号なし整数型、int は32ビットとする。上のコードを実行したときの結果として、正しいものはどれか。
  3. int と unsigned int は32ビットとする。上のコードを実行したときの結果として、正しいものはどれか。
  4. unsigned int は32ビットとする。上のコードを実行したときの動作として、正しいものはどれか。
  5. 「char c = 200;」とした c を printf の %d で表示するプログラムを、x86-64 の Linux 向けの gcc でコンパイルして実行すると −56、Arm の Linux 向けの gcc では 200 と表示された。違いが生じる理由として正しいものはどれか。