ホームページ >バックエンド開発 >C++ >符号付き整数オーバーフローは C ではまだ未定義の動作ですか?

符号付き整数オーバーフローは C ではまだ未定義の動作ですか?

DDD
DDDオリジナル
2024-12-21 04:02:09823ブラウズ

Is Signed Integer Overflow Still Undefined Behavior in C  ?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。