2020/3/23
Javaプログラミング
short型の掛け算(乗算)
short型の変数どうしの掛け算の結果を、shrot型の変数に格納しようとするとコンパイルエラーが起きるので、int型などshort型よりも持てる値の範囲が広い変数に格納するようにします。ただし、掛け算の結果をshort型に型キャストすることでコンパイルエラーは避けられます。作成するプログラムの設計(仕様)で、掛け算の結果がshort型の範囲(-32768~32767)を超えない場合に限り、型キャストが使用できますが、範囲を超えた場合には想定外の数値が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個
精度が失われる可能性があるという理由でコンパイルに失敗しています。
ans = a * b;
を変更して
ans = (short)( a * b );
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)と違っています。
次の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
以上です。