C言語の基礎

int と unsigned int は32ビットとする。次のうち、C言語の規格で未定義動作になるものはどれか。

  1. Aunsigned int の変数の値が最大値 4294967295 のときに、1を足す
  2. Bint の負の値を、>> で右に1ビットシフトする
  3. Cint の変数の値が最大値 2147483647 のときに、1を足す
答えと解説を見る

正解:C. int の変数の値が最大値 2147483647 のときに、1を足す

int の 2147483647 + 1 のように、符号付き整数の演算の結果が表せる範囲を超えることは、未定義動作です。符号なし整数の演算は 2³² で割った余りに戻ると決まっているので、4294967295 + 1 は0になり、未定義動作ではありません。負の値の右シフトは、算術シフトになるか論理シフトになるかを処理系が決める処理系定義の動作で、gcc では算術シフトになります。一方、負の値の左シフトは未定義動作です。

  • A. 符号なしの演算はあふれると0の側に戻ると決まっていて、結果は0です。
  • B. 負の値の右シフトは処理系定義の動作で、未定義動作ではありません。
  • C. 正しい。符号付き整数のオーバーフローは未定義動作です。
この分野を解く 分野ページへ

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

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

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

  1. 上の関数を gcc で最適化を有効にしてコンパイルすると、if (p == NULL) の判定が削除されることがある。その理由として正しいものはどれか。
  2. C言語の規格で、int型の大きさについて定められていることとして、正しいものはどれか。
  3. 組込みのプログラムで、32ビットの周辺レジスタの値を入れる変数を、unsigned int ではなく stdint.h の uint32_t で宣言することが多い。主な理由として正しいものはどれか。
  4. 整数どうしの割り算を含む上のコードを実行したときの出力として、正しいものはどれか。
  5. 前置と後置の ++ を使った上のコードを実行したときの出力として、正しいものはどれか。