Top > Programming > CommonTips > overflow
Last-modified: Fri, 31 May 2013 03:52:21 JST
Counter:2540 Today:2 Yesterday:1 Online:13
このエントリーをはてなブックマークに追加

値型の桁あふれ(overflow)

About

プログラミング言語やそのプログラムを実行する環境下では、保存できる値の大きさに限界があります。例えばbyte型はふつう[0~255]までの値を保存することができますし、int型は負の値を含めて[-2,147,483,648 ~ 2,147,483,647]までの値を保存することができます。

なぜ保存する値の大きさに限界があるのかというと、(基本的には)メモリの量に限界があるためです。多くの人が一時的に覚えておける情報に限りがあるように、コンピュータも覚えておけるデータの量に限りがあるのです。

そこで"桁あふれ(桁あぶれ/overflow)"が発生する可能性があります。つまり、byte型の場合に256が与えられたり、-1が与えられる場合です。byteはどちらの値も保存することができません。そのような場合、プログラムはどのように処理されるのでしょうか。

C#でoverflowの実験

まず結論から、"言語や実行環境によって結果は変わる"、ということを述べなければなりません。ここではC#での例を示していますが、同じC#でも実行環境やバージョンによって左右されることがありますし、CやJava、PHPやPythonなどの他の言語と他の環境ではことなる結果を示すことがあるからです。ですが多くの場合、ここで行う実験と同じような結果になると思われます。

実行するコードは次の通りです。まずbyte型に255の値を与えて、その値を1ずつ2回加算した結果を出力します。続いてbyte型に0を与えて、その値を1ずつ2回減算した結果を出力します。

    class Program
    {
        static void Main(string[] args)
        {
            byte byteValue = 255;
            byteValue += 1;
            byteValue += 1;
            Console.WriteLine(byteValue);

            byteValue = 0;
            byteValue -= 1;
            byteValue -= 1;
            Console.WriteLine(byteValue);

            Console.ReadLine();
        }
    }

結果は次の通りとなります。255に1加算して得られる値256はbyte型に保存できないため、overflow(オーバーフロー)を引き起こし、byte型は0になります。そこにさらに1が加算されることによってbyte型に最終的に保存される値は1となります。減算の場合は逆です。負の値は保存できないため、-1となったbyte型の値はbyte型の最大値である255になり、さらにそこから1減算されることで254となります。このように、overflowが起こった場合には、最小値を下回った場合は最大値から、最大値を上回った場合は最小値から、演算されるのが一般的です。

1
254

適切な値型の選択によるメモリの節約

プログラマが適切なデータ型を判断しプログラミングすることによってメモリの量を節約することができます。例えば値が必ず0~255に収まるのであればint型よりもbyte型を利用したほうが必要とするメモリは少なくなります。小数点以下の値をあつかうことができるfloat型とdouble型は、float型の方が利用するメモリは少ないです。ただし割り算などによって導かれる値の精度はdoubleの方が高い(≒保存する小数点以下の桁数が多い)ので、必ずしもfloatを採用するのが良い、という訳ではありません。適材適所です。ゲームなどの場合はfloatが使われていることが多いですね。