C言語の基礎
int と unsigned int は32ビットとする。次のうち、C言語の規格で未定義動作になるものはどれか。
- Aunsigned int の変数の値が最大値 4294967295 のときに、1を足す
- Bint の負の値を、>> で右に1ビットシフトする
- Cint の変数の値が最大値 2147483647 のときに、1を足す
答えと解説を見る
正解:C. int の変数の値が最大値 2147483647 のときに、1を足す
int の 2147483647 + 1 のように、符号付き整数の演算の結果が表せる範囲を超えることは、未定義動作です。符号なし整数の演算は 2³² で割った余りに戻ると決まっているので、4294967295 + 1 は0になり、未定義動作ではありません。負の値の右シフトは、算術シフトになるか論理シフトになるかを処理系が決める処理系定義の動作で、gcc では算術シフトになります。一方、負の値の左シフトは未定義動作です。
- A. 符号なしの演算はあふれると0の側に戻ると決まっていて、結果は0です。
- B. 負の値の右シフトは処理系定義の動作で、未定義動作ではありません。
- C. 正しい。符号付き整数のオーバーフローは未定義動作です。