EeBlog(テクニカルブログ)

第25回 int型の限界

今回のテーマは「int型の限界」です。

我々は普段何気なくint型を使っています。 単なる数値データとして扱うこともあれば、ループのカウンタ、フラグとしてなど、いろんな使い方があります。 何かと便利なint型ですが、仕様上、-2147483648~2147483647という明確な範囲が存在します。 今回はint型の最小値と最大値における動作を学んでみましょう。

以下のクラスを実行してみてください。 int型の最大値±1と最小値±1が表示されます。

public class Main {
    public static void main(String[] args) {
        System.out.println("int型の最大値+1: " + (Integer.MAX_VALUE + 1));
        System.out.println("int型の最大値   : " + (Integer.MAX_VALUE ));
        System.out.println("int型の最大値-1: " + (Integer.MAX_VALUE - 1));
        System.out.println();

        System.out.println("int型の最小値+1: " + (Integer.MIN_VALUE + 1));
        System.out.println("int型の最小値    : " + Integer.MIN_VALUE);
        System.out.println("int型の最小値-1: " + (Integer.MIN_VALUE - 1));
    }
 }

int型の最大値+1がint型の最小値と同じ値だったり、int型の最小値-1がint型の最大値と同じ値となって出力されます。 いったいどうしてこうなるのでしょうか。

 

この現象を理解するには2進数の2の補数表現で考える必要があります。 int型の最大値を2進数にすると、01111111111111111111111111111111となります。 int型の最小値を2進数にすると、10000000000000000000000000000000となります。 最大値を+1すると、10000000000000000000000000000000となります。 最小値を-1すると、01111111111111111111111111111111となります。 2進数において、ごくごく普通の計算が行われているだけなのですが、コンピューターは一番左の桁を符号として扱っていますので、正負の逆転という現象が起きるわけです。

int型の範囲を超えそうな整数値を扱う場合、通常はlong型やBigInteger型が使われるので、コーディングにおいてint型の範囲を意識する機会はあまりないでしょう。 しかし、ブラックボックステストの境界値分析のように、有効な値の最大値と最小値、その前後の値における動作を確認することは非常に重要です。 例えば、絶対値を返すMathクラスのabsメソッドの引数にint型の最小値を使うと、int型の最小値が返ってきます。

人間の常識とコンピュータの動作は必ずしも一致するとは限りません。 開発者はコンピュータの動作をきちんと理解して、プログラミングすることを心がけましょう。