Javaプログラミング学習サイト ゆるゆるプログラミング

2020/03/23 公開

・short型の掛け算(乗算)

Javaの演算子'*'を使ってshort型どうしの掛け算を使用する際の注意点は以下のとおりです。

short型変数どうしの掛け算の結果を、shrot型の変数に格納しようとするとコンパイルエラーが起きるので、int型などshort型よりも持てる値の範囲が広い変数に格納するようにします。ただし、掛け算の結果をshort型型キャストすることでコンパイルエラーは避けられます。作成するプログラムの設計(仕様)で、掛け算の結果がshort型の範囲(-32768~32767)を超えない場合に限り、型キャストが使用できますが、範囲を超えた場合には想定外の数値がshort型に格納されるので注意してください。

それでは、short型を使った掛け算を行うJavaソースコードの具体例を見ていきましょう。

”MultipliedSample1.java”は、short型整数どうしの掛け算を行おうとしたJavaのソースコードですが、コンパイルに失敗します。

MultipliedSample1.java ← クリックしてダウンロードページに移動
001:    //
002:    // ※このソースコードは、コンパイルエラーに失敗します。
003:    //   コンパイルエラーが出るソースコード例です。
004:    //
005:    public class MultipliedSample1 {
006:    	public static void main( String[] args ) {
007:    		// 変数の宣言
008:    		short a, b, ans;
009:    
010:    		// 掛ける値を代入
011:    		a = 5000;
012:    		b = 100;
013:    
014:    		// 掛け算
015:    		ans = a * b;	// ← コンパイルエラー
016:    
017:    		// 掛け算の結果を表示
018:    		System.out.print( a + "×" + b + "=" + ans );
019:    	}
020:    }

MultipliedSample1.javaのコンパイル結果

コンパイルエラー(shortの掛け算)

精度が失われる可能性があるという理由でコンパイルに失敗しています。

次のJavaソースコード”MultipliedSample2.java”は、”MultipliedSample1.java”コンパイルでエラーが出る箇所

  ans = a * b;

を変更して

  ans = (short)( a * b );

としてコンパイルエラーを無くしたものです。これは、"a * b"の計算結果をshort型型キャストし、精度に関係なくshort型変数ansに代入するものです。

MultipliedSample2.java ← クリックしてダウンロードページに移動
001:    public class MultipliedSample2 {
002:    	public static void main( String[] args ) {
003:    		// 変数の宣言
004:    		short a, b, ans;
005:    
006:    		// 掛ける値を代入
007:    		a = 5000;
008:    		b = 100;
009:    
010:    		// 掛け算
011:    		ans = (short)( a * b );
012:    
013:    		// 掛け算の結果を表示
014:    		System.out.print( a + "×" + b + "=" + ans );
015:    	}
016:    }

MultipliedSample2.javaの出力結果

5000×100=-24288

コンパイルには成功していますが、計算結果が実際の計算値(500000)と違っています。

これは、short型が持てる値の範囲は-32768~32767であるため、実際の計算値である500000を持つことが出来なかったために起こる現象です。(オーバーフロー

次のJavaソースコード”MultipliedSample3.java”は、”MultipliedSample1.java”の掛け算の結果を、int型float型double型変数に代入することで正しい結果が得られるようにしたものです。

MultipliedSample3.java ← クリックしてダウンロードページに移動
001:    public class MultipliedSample3 {
002:    	public static void main( String[] args ) {
003:    		// 変数の宣言
004:    		short  a, b;
005:    		int    ans_i;	// int型の結果
006:    		float  ans_f;	// float型の結果
007:    		double ans_d;	// double型の結果
008:    
009:    		// 掛ける値を代入
010:    		a = 5000;
011:    		b = 100;
012:    
013:    		// 掛け算した結果を代入
014:    		ans_i = a * b;
015:    		ans_f = a * b;
016:    		ans_d = a * b;
017:    
018:    		// 掛け算の結果を表示
019:    		System.out.println( "int型: " + a + "×" + b + "=" + ans_i );
020:    		System.out.println( "float型: " + a + "×" + b + "=" + ans_f );
021:    		System.out.println( "double型: " + a + "×" + b + "=" + ans_d );
022:    	}
023:    }

MultipliedSample3.javaの出力結果

int型: 5000×100=500000
float型: 5000×100=500000.0
double型: 5000×100=500000.0

short型より持てる値の範囲が広い型の変数に掛け算の結果を代入することで正しい結果が得られています。

■関連コンテンツ

Javaの変数 Javaで扱う変数について解説
無限大 Infinity 無限大(∞)について
非数値 NaN 非数値(数値ではない値)について
計算結果の表示 四則演算(足し算/引き算/掛け算/割り算)について

■新着情報

2021.08.04 書式指定でコンソール出力 printf()とは?

■広告

Topへ