ホームページ >バックエンド開発 >C++ >C では、符号付き整数オーバーフローと符号なし整数オーバーフローはどのように異なりますか?

C では、符号付き整数オーバーフローと符号なし整数オーバーフローはどのように異なりますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-26 08:27:10833ブラウズ

How do signed and unsigned integer overflows differ in C  ?

符号付き整数および符号なし整数での整数オーバーフローの動作

背景

整数を使用する場合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 サイトの他の関連記事を参照してください。

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