2020/3/23

Javaプログラミング

short型の掛け算(乗算)

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

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

Javaソースコード

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

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

MultipliedSample1.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
//
// ※このソースコードは、コンパイルエラーに失敗します。
//   コンパイルエラーが出るソースコード例です。
//
public class MultipliedSample1 {
	public static void main( String[] args ) {
		// 変数の宣言
		short a, b, ans;

		// 掛ける値を代入
		a = 5000;
		b = 100;

		// 掛け算
		ans = a * b;	// ← コンパイルエラー

		// 掛け算の結果を表示
		System.out.print( a + "×" + b + "=" + ans );
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis MultipliedSample1.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac MultipliedSample1.java

コンパイル結果

MultipliedSample1.java:15: エラー: 不適合な型: 精度が失われる可能性があるintからshortへの変換
                ans = a * b;    // ← コンパイルエラー
                        ^
エラー1個

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

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

		ans = a * b;

を変更して

		ans =  (short)( a * b );

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

MultipliedSample2.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
public class MultipliedSample2 {
	public static void main( String[] args ) {
		// 変数の宣言
		short a, b, ans;

		// 掛ける値を代入
		a = 5000;
		b = 100;

		// 掛け算
		ans =  (short)( a * b );

		// 掛け算の結果を表示
		System.out.print( a + "×" + b + "=" + ans );
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis MultipliedSample2.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac MultipliedSample2.java

実行

C:\talavax\javasample>java MultipliedSample2

実行結果

5000×100=-24288

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

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

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

MultipliedSample3.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
public class MultipliedSample3 {
	public static void main( String[] args ) {
		// 変数の宣言
		short  a, b;
		int    ans_i;	// int型の結果
		float  ans_f;	// float型の結果
		double ans_d;	// double型の結果

		// 掛ける値を代入
		a = 5000;
		b = 100;

		// 掛け算した結果を代入
		ans_i = a * b;
		ans_f = a * b;
		ans_d = a * b;

		// 掛け算の結果を表示
		System.out.println( "int型: " + a + "×" + b + "=" + ans_i );
		System.out.println( "float型: " + a + "×" + b + "=" + ans_f );
		System.out.println( "double型: " + a + "×" + b + "=" + ans_d );
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis MultipliedSample3.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac MultipliedSample3.java

実行

C:\talavax\javasample>java MultipliedSample3

実行結果

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

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

以上です。

関連コンテンツ

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

基本的な計算である足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)を行うプログラム作成。

2020.03.23

プログラムの最初に実行されるメソッドは?

2022.12.13

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

プログラミングで使う変数って何?

2020.03.23

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

データの型を変換する方法を詳しく解説しています。例)int型 → long型

2015.11.01

自然数と整数って何が違う?

2020.03.23

広告