ホームページ >バックエンド開発 >C++ >C で整数のオーバーフローが発生すると、符号付き整数と符号なし整数で異なる結果が生じるのはなぜですか?

C で整数のオーバーフローが発生すると、符号付き整数と符号なし整数で異なる結果が生じるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-12 01:37:03819ブラウズ

Why does integer overflow in C   lead to different results for signed and unsigned integers?

符号付き/符号なし整数オーバーフローによる予期しない結果

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 の補数が使用されるため、予期しないラップアラウンド動作が発生します。たとえば、上記のプログラムでは、

  • x は 0 に初期化され、正の最大値 2147483647 までオーバーフローします。
  • このオーバーフローした値に 1 を加算すると、ラップされます。負の最小値付近、 -2147483648.

符号なし整数の場合、オーバーフローは明確に定義されており、モジュロ 2ビットをラップアラウンドします。つまり、最大値をオーバーすると値が0にリセットされます。これは、y の出力を説明しています。y は、符号なし最大値 4294967295 をオーバーフローした後、0 に戻ります。

符号付き整数のオーバーフローの動作は言語によって保証されておらず、言語によって異なる可能性があることに注意することが重要です。実装とマシンのアーキテクチャ。したがって、プログラム内でそのような動作に依存することは一般的に推奨されません。

以上がC で整数のオーバーフローが発生すると、符号付き整数と符号なし整数で異なる結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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