今回のテーマは「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型の最小値が返ってきます。
人間の常識とコンピュータの動作は必ずしも一致するとは限りません。
開発者はコンピュータの動作をきちんと理解して、プログラミングすることを心がけましょう。
■[Javaワンポイント]内の前後の記事
↑ 第 25 回 ~ ジェネリックスメソッド ~
→ 第 24 回 ~ int型の限界 ~
↓ 第 24 回 ~ Guiceその2 ~
■更新日時での前後の記事
↑ 11月7日 お天気
→ 第 24 回 ~ int型の限界 ~
↓ 11月6日 お天気
