符号付き整数および符号なし整数での整数オーバーフローの動作
背景
整数を使用する場合C 、整数の動作を理解することが重要ですオーバーフロー。整数値が表現可能な最大値または最小値を超えると発生します。この記事は、特定のプログラムで観察された結果に基づいて、符号付き整数オーバーフローと符号なし整数オーバーフローのさまざまな結果を説明することを目的としています。
プログラムと出力
次のプログラムは整数オーバーフローのテストに使用されます:
#include <iostream> int main() { int x(0); std::cout << x << std::endl; x = x + 2147483647; std::cout << x << std::endl; x = x + 1; std::cout << x << std::endl; std::cout << std::endl; unsigned int y(0); std::cout << y << std::endl; y = y + 4294967295; std::cout << y << std::endl; y = y + 1; std::cout << y << std::endl; }
プログラムは次を生成します。出力:
0 2147483647 -2147483648 0 4294967295 0
説明
符号付き整数オーバーフロー
符号付き整数オーバーフローは、C では未定義の動作です。これは、結果が保証されず、実装に依存することを意味します。この場合、2 回目のインクリメント操作後の x の値は、データ型の負の最小値にラップアラウンドし、-2147483648 になります。これは、ほとんどの実装が符号付き整数の 2 の補数表現を使用しているためです。
符号なし整数オーバーフロー
符号なし整数オーバーフローは C で明確に定義されています。結果はモジュロ算術によって計算され、値はデータ型の最小値にラップアラウンドされます。この場合、2 回目のインクリメント操作後の y の値は 0 に戻ります。
概要
要約すると、符号付き整数のオーバーフローは未定義の動作ですが、符号なし整数のオーバーフローは未定義の動作です。オーバーフローは明確に定義されており、値のラップが行われます。したがって、予期しない結果を避けるために、C プログラムでは整数オーバーフローを慎重に処理することが重要です。
以上がC では、符号付き整数オーバーフローと符号なし整数オーバーフローはどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。