符号付き/符号なし整数オーバーフローによる予期しない結果
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
説明
符号付き整数の場合、オーバーフローの動作は未定義です。ほとんどの実装では 2 の補数が使用されるため、予期しないラップアラウンド動作が発生します。たとえば、上記のプログラムでは、
符号なし整数の場合、オーバーフローは明確に定義されており、モジュロ 2ビットをラップアラウンドします。つまり、最大値をオーバーすると値が0にリセットされます。これは、y の出力を説明しています。y は、符号なし最大値 4294967295 をオーバーフローした後、0 に戻ります。
符号付き整数のオーバーフローの動作は言語によって保証されておらず、言語によって異なる可能性があることに注意することが重要です。実装とマシンのアーキテクチャ。したがって、プログラム内でそのような動作に依存することは一般的に推奨されません。
以上がC で整数のオーバーフローが発生すると、符号付き整数と符号なし整数で異なる結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。