ホームページ >バックエンド開発 >C++ >2 の補数表現は C の符号付き整数オーバーフローにおける未定義の動作を排除しますか?

2 の補数表現は C の符号付き整数オーバーフローにおける未定義の動作を排除しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-23 19:54:09949ブラウズ

Does 2's Complement Representation Eliminate Undefined Behavior in C   Signed Integer Overflow?

C における符号付き整数オーバーフローの未定義の動作

符号付き整数の値が表現可能な範囲を超えたときに発生する符号付き整数オーバーフローは、 -C では未定義の動作であることが知られています。ただし、C 11 の cstdint ドキュメントには興味深い記述が導入されています。int8_t、int16_t、int32_t、および int64_t 型の負の値は、2 の補数を使用して表現されるように明示的に指定されています。

この仕様では、次のような疑問が生じます。これらの型の負の値の 2 の補数は、未定義の動作ステータスを変更します。オーバーフロー?

残念ながら、答えは はいのままです。 C 11 標準のセクション 18.4.1 によると、ヘッダーはすべての関数、型、およびマクロを C 標準のセクション 7.20 と同様に定義します。 C11 標準のセクション 7.20.1.1 では、2 の補数表現を使用した符号付き整数型としての intN_t の定義をさらに明確にしています。

この 2 の補数表現の仕様にもかかわらず、C 11 標準はセクション 5/4 で、次のことを明確に述べています。未定義の数学的結果をもたらす式、またはその型の表現可能な範囲外にある式は、結果が未定義になります

したがって、負の値に 2 の補数を使用することは、これらの型の算術演算がモジュロ 2^n の動作に従うことを意味するものではありません。ただし、符号なし整数の場合、標準では 2^n を法とする算術の法則が適用され、オーバーフロー動作が数学的に定義され、表現可能な範囲内に収まるように明示的に指定されています。したがって、符号なしオーバーフローは未定義の動作とは見なされません。

以上が2 の補数表現は C の符号付き整数オーバーフローにおける未定義の動作を排除しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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