C言語の基礎

unsigned char a = 200, b = 100;
int s = a + b;
unsigned char c = a + b;
printf("%d %d\n", s, c);

unsigned char は8ビット、int は32ビットとする。上のコードを実行したときの出力として、正しいものはどれか。

  1. A44 44
  2. B300 44
  3. C300 300
答えと解説を見る

正解:B. 300 44

C言語では、int より小さい型(char や short など)の値は、計算の前に int に変換されます(整数拡張)。そのため a + b は8ビットではなく int で計算されて300になり、int の s にはそのまま300が入ります。8ビットの c に代入するときは、256で割った余りの44に変換されます。8ビットのマイコンでも、規格のうえでは式の途中の計算は int の幅で行われます。

  • A. 加算は int で行われるので、s には300が入ります。8ビットのまま計算されると考えた場合の値です。
  • B. 正しい。s は int で計算した300、c は300を256で割った余りの44です。
  • C. unsigned char の c には256以上の値は入らず、300は44に変換されます。
この分野を解く 分野ページへ

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

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

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

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