C では符号付き整数オーバーフローの動作はまだ未定義ですか?
C 11 標準で定義されているように、符号付き整数オーバーフローは未定義の動作のままです。 cstdint のドキュメントでは、int8_t、int16_t、int32_t、および int64_t 型は負の値に 2 の補数を使用すると述べていますが、オーバーフローの動作は依然として未定義とみなされます。
C 11 標準のパラグラフ 5/4 では、次のように強調されています。
**式の評価中に、結果が数学的に定義されていないか、その型の
表現可能な値の範囲内にない場合、動作は未定義です。**
したがって、これらの符号付き型に対して 2 の補数表現が使用されていても、2^n を法とする算術演算は暗黙的に行われません。
逆に、C 11 標準では、パラグラフ 3.9.1/4 で次のように明示的に指定されています。符号なし算術はモジュラー算術に準拠します:
符号なしと宣言された符号なし整数は、2^nを法とする算術の法則に従うものとします。ここで、n は値表現のビット数
です。整数の特定のサイズ
結果として、符号なし算術演算は常に数学的に定義可能であり、結果の値は表現可能な範囲内にあるため、未定義動作句から除外されます。脚注 46 はこれをさらに明確にしています:
これは、結果として得られる符号なし整数型で表現できない結果が 1 を法として削減されるため、符号なし
算術演算がオーバーフローしないことを意味します。
結果の符号なし整数で表現できる最大値より大きいtype.
要約すると、符号付き型に 2 の補数表現を使用すると、負の値に対して明確に定義された動作が提供されますが、標準が実装依存の動作をオーバーライドするため、これらの型の整数オーバーフローは C では未定義の動作のままになります。 .
以上が符号付き整数オーバーフローは C ではまだ未定義の動作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。