2016/01/20 公開
・変数の最小値・最大値
ここでは、プログラムの中で数値型変数の最小値と最大値を取得する方法を説明します。
以下の表は、変数の型ごとに最小値と最大値を取得する方法をまとめたものです。MIN_VALUEで最小値、MAX_VALUEで最大値が取得できます。
変数型 | 最小値 | 最大値 |
---|---|---|
byte | Byte.MIN_VALUE | Byte.MAX_VALUE |
short | Short.MIN_VALUE | Short.MAX_VALUE |
int | Integer.MIN_VALUE | Integer.MAX_VALUE |
float | Float.MIN_VALUE | Float.MAX_VALUE |
double | Double.MIN_VALUE | Double.MAX_VALUE |
変数の最小値と最大値を表示するソースプログラムを作成しました。
MinMaxValue.java ← クリックしてダウンロードページに移動
001: public class MinMaxValue { 002: public static void main( String[] args ) { 003: System.out.println( "byteの最小値=" + Byte.MIN_VALUE ); 004: System.out.println( "byteの最大値=" + Byte.MAX_VALUE ); 005: System.out.println(); 006: System.out.println( "shortの最小値=" + Short.MIN_VALUE ); 007: System.out.println( "shortの最大値=" + Short.MAX_VALUE ); 008: System.out.println(); 009: System.out.println( "intの最小値=" + Integer.MIN_VALUE ); 010: System.out.println( "intの最大値=" + Integer.MAX_VALUE ); 011: System.out.println(); 012: System.out.println( "longの最小値=" + Long.MIN_VALUE ); 013: System.out.println( "longの最大値=" + Long.MAX_VALUE ); 014: System.out.println(); 015: System.out.println( "floatの最小値=" + Float.MIN_VALUE ); 016: System.out.println( "floatの最大値=" + Float.MAX_VALUE ); 017: System.out.println(); 018: System.out.println( "doubleの最小値=" + Double.MIN_VALUE ); 019: System.out.println( "doubleの最大値=" + Double.MAX_VALUE ); 020: } 021: }
MinMaxValue.javaの出力結果
byteの最小値=-128 byteの最大値=127 shortの最小値=-32768 shortの最大値=32767 intの最小値=-2147483648 intの最大値=2147483647 longの最小値=-9223372036854775808 longの最大値=9223372036854775807 floatの最小値=1.4E-45 floatの最大値=3.4028235E38 doubleの最小値=4.9E-324 doubleの最大値=1.7976931348623157E308
この結果から、floatとdoubleの最小値は、0.0(ゼロ)として扱わない数値の最小値であることがわかります。変数に格納できる範囲の最小は、それぞれの先頭にマイナスを付けた-Float.MAX_VALUEと-Double.MAX_VALUEと考えて良いです。Float.MIN_VALUEとDouble.MIN_VALUEを使うときには、これらのことに気を付けてください。
次にこれらの使い方を紹介します。
数値が扱えるJavaの変数には、byte型/short型/int型/long型/float型/double型があり、それぞれ格納できる数値の範囲が違います。変数への値の代入や計算のオーバーフロー・アンダーフローを避けるために変数が持てる値の範囲をプログラム中で取得し、数値が変数値の範囲内かどうかを判定します。これは、まず情報量の多い変数に値を代入・計算し、その結果が格納したい変数型の範囲内であれば、その変数に値を格納する方法で行われます。
具体的には、int型の変数に計算結果を代入する場合、int型より情報量の多いlong型で計算を行い、その結果の範囲がint型の範囲に入っているかを判定し、範囲内であればlong型の値をint型の変数に型キャストして代入します。範囲外であれば、処理の中断/エラーメッセー表示などを行うようにします。ただし、int型どうしの計算でオーバーフローしないことが明らかであれば、このような処理は不要です。float型の計算も同様に、doublet型で計算した結果で判定します。
以下のソースコードは、int型どうしの計算でのオーバーフローの確認と、計算結果がint型の範囲に収まっているかの判定の仕方が分かるようになっています。
MinMaxValue2.java ← クリックしてダウンロードページに移動
001: public class MinMaxValue2 { 002: public static void main( String[] args ) { 003: int a, b; 004: 005: // オーバーフローした結果をそのまま表示 006: a = 100000; 007: b = 100000; 008: int ans = a * b; 009: 010: System.out.println( "オーバーフロー有 : " + a + "x" + b + "=" + ans ); 011: 012: // long型でオーバーフローを防ぐ 013: long ansl = (long)a * (long)b; 014: System.out.println( "オーバーフロー無 : " + a + "x" + b + "=" + ansl ); 015: 016: // int型の変数に計算結果を代入できるかを判定 017: if ( ( ansl < (long)Integer.MIN_VALUE ) || 018: ( ansl > (long)Integer.MAX_VALUE ) ) 019: // 代入不可 020: System.out.println( ansl + "をint型変数に代入できない" ); 021: else { 022: // 代入可 023: System.out.println( ansl + "をint型変数に代入できる" ); 024: // 型キャストして代入 025: ans = (int)ansl; 026: } 027: } 028: }
MinMaxValue2.javaの出力結果
オーバーフロー有 : 100000x100000=1410065408 オーバーフロー無 : 100000x100000=10000000000 10000000000をint型変数に代入できない
上記の出力結果のように、オーバーフローした計算結果もint型の変数に格納されてしまい、その後の処理で異常が発生する可能性が高くなります。桁数の多い数値どうしの計算を行う処理には、情報量の多い型で計算して範囲の検査をすると安全に動作するプログラムが作成できます。
■関連コンテンツ
Javaの変数 | Javaで扱う変数について解説 |
■新着情報
2020.12.22 | 格子座標から円周率πを計算 | 格子座標→円周率πを求める |
2020.12.16 | ライプニッツの公式 | 公式で円周率π(パイ)を計算 |
■広告




フィギュア予約最大25%OFF+ポイント5%還元!ホビーサーチ

~約8,000名の受講生と80社以上の導入実績~ 企業向けプログラミング研修ならCodeCamp

日本最大級ショッピングサイト!お買い物なら楽天市場
