C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の組み込みデータ型が表現範囲を超えるとどうなる?オーバーフローによる無限ループの挙動を解説

C++では、組み込みデータ型が表現できる範囲を超えると、予期しない動作が発生することがあります。この記事では、具体的なコード例を通じて、char型・bool型・unsigned short型がそれぞれ範囲を超えたときにどのような挙動を示すのかを解説します。

char型の場合:無限ループに陥る

まずはchar型の例です。以下のコードでは、0から300までの値を順に出力しようとしています。一見すると0から300まで出力して終了しそうですが、実際には無限ループが発生します。char型が保持できる値の範囲は-128から127までです。そのため、値が127を超えて増加すると、再び-128に戻ってしまい、永遠に300へ到達することはありません。

コード例

#include <iostream>
using namespace std;
int main() {
    for (char x = 0; x <= 300; x++)
        cout << x;
}

出力結果

文字が無限に出力され続けます。

bool型の場合:1が出力され続ける

次にbool型で試してみましょう。bool型は0(false)と1(true)の2つの値しか格納できません。ループが1から始まるため、1が無限に出力され続けます。1 + 1で2になろうとした瞬間、ブール値として再び1が代入されるためです。

コード例

#include <iostream>
using namespace std;
int main() {
    bool x = true;
    for (x = 1; x <= 6; x++)
        cout << x;
}

出力結果

1111………

unsigned short型の場合:0に戻って無限に続く

unsigned shortのような符号なし整数型は、0から65535までの値を格納できます。以下のループでは、65530から65535まで出力した後、値が0に戻ります。0は65536より小さいためループ条件は常に真となり、この場合も数値が無限に出力され続けます。

コード例

#include <iostream>
using namespace std;
int main() {
    unsigned short x;
    for (x = 65530; x <= 65536; x++)
        cout << x << ", ";
}

出力結果

65530, 65531, 65532, 65533, 65534, 65535, 0, 1, …………

まとめ

このように、C++の組み込みデータ型は表現範囲を超えると値が折り返される(ラップアラウンドする)ため、ループの終了条件が満たされず無限ループに陥る可能性があります。ループカウンタには表現範囲が十分に広いint型やlong型などを使用し、境界値に注意して設計することが重要です。

  1. C#のポインターデータ型とは?宣言方法とunsafeコードの使い方を解説

    C#のポインターデータ型とはポインター(pointer)とは、別の変数のメモリアドレスを値として保持する特殊な変数です。つまり、ポインターはメモリ上の特定の場所を直接指し示すことができます。通常の変数や定数と同様に、ポインターも使用する前に必ず宣言する必要があります。ポインターの宣言構文C#でポインターを宣言する基本的な構文は以下の通りです。type *var-name;具体的な宣言例を見てみましょう。int *ip; /* 整数型(int)へのポインター */ double *dp; /* 倍精度浮動小数点型(double)へのポインター */このように、*(アスタリスク)を使って

  2. Python 3の標準データ型とは?数値・シーケンス・辞書の基本をわかりやすく解説

    Python 3の標準データ型の概要Python 3に標準で用意されているデータ型は、大きく分けて「数値型」「シーケンス型」「辞書(ディクショナリ)型」の3つに分類できます。辞書はキーと値のペアを格納するコレクションであり、Pythonプログラミングにおいて最も頻繁に使われるデータ構造の一つです。数値型(Numeric Types)数値型には「整数(int)」「浮動小数点数(float)」「複素数(complex)」の3種類があります。整数(int):小数点を含まない整数値です。例:10、-10浮動小数点数(float):小数部分を持つ実数です。例:1.55、0.005複素数(complex)