C の符号付き整数オーバーフロー : まだ未定義の動作
C 11 cstdint ドキュメントで強調されているように、int8_t、int16_t などの符号付き整数型、int32_t、および int64_t は使用します負の値の場合は 2 の補数。これは疑問を引き起こしました: これは、これらの型のオーバーフローが未定義の動作とみなされなくなったことを意味しますか?
いいえ、これらの型のオーバーフローは C では未定義の動作のままです。
C 11 標準のパラグラフ 5/4 によると、結果が数学的に定義されていない式、または型の表現可能な範囲外にある式は、次のようになります。未定義の動作。
int8_t、int16_t、int32_t、および int64_t は 2 の補数を使用しますが、これは 2^n を法とする算術演算が適用されることを意味するものではありません。この規格では、次のように明示的に規定されています。
「符号なし算術演算の結果は常に「数学的に定義」され、結果は常に表現可能な範囲内にあります。したがって、5/4 は適用されません。」
したがって、符号なし演算は 2^n を法とする算術の法則に従い、オーバーフローは未定義の動作ではありません。ただし、符号付き算術演算の場合、基礎となる表現に関係なく、オーバーフローの動作は未定義のままです。
以上がC の符号付き整数オーバーフローはまだ未定義の動作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。