2016-10-08 8 views
3

次のシナリオでは、Javaの動作を理解するのが難しいです。たとえば、私は単純に2つのint値を乗算し、結果を画面に出力する乗算方法を持っています。整数オーバーフローでパラメータ型を割り当てる効果

private static void multiply() { 

    int firstValue = Integer.MAX_VALUE; 
    int secondValue = 2;     //double secondValue=2 

    double result = firstValue * secondValue; 

    System.out.println("Result is: " + result); 
} 

となり、整数オーバーフローが発生するため、結果は-2になります。ただし、ここで計算結果はdoubleに代入され、firstValueとsecondValueの乗算よりもはるかに大きな値を受け入れます。

この問題に対する私の質問は次のとおりです。

結果が倍精度に割り当てられても、整数オーバーフローが発生するのはなぜですか?

2番目の値の型をdoubleに変更すると(コメントに記載されている)、結果は正しいです。乗数の型がdoubleに変更されたとき、Javaの動作が異なるのはなぜですか?

+4

計算は整数として行われ、結果は計算後にdoubleにキャストされます。だからあなたのintが2倍の時に結果が得られるMAX_VALUEがあります。 – baao

+0

乗算には整数しか含まれていないので、整数乗算として行われます。一度だけ実行されると、結果はdoubleに変換されますが、その時点ではすでに遅すぎます。乗算の値の1つをキャストします。 – Robert

答えて

3

Javaはtarget type castingをサポートしていません。

private static void multiply() { 

    int firstValue = Integer.MAX_VALUE; 
    int secondValue = 2; 
    double one = 1.0; 
    double result = one * firstValue * secondValue; 

    System.out.println("Result is: " + result); 
} 

Target Type castingそれに割り当てなければならない変数の型に結果の値をキャストします。
結果がdouble変数に割り当てられなければならないことはわかりません。この場合、最大のデータ型はintなので、式はintデータ型で計算されます。
doubleと掛け合わせると、式はdoubleタイプで計算され、答えは正しいです。

+0

しかし、あなたの例では、変数** one **が最後にあるとき(double result = firstValue * secondValue * one)、整数オーバーフローが発生します。私はJavaが計算の変数の順序を見ていると思いますか? –

+0

これは操作の順序によるものです。 –

0

これは、2つの整数を掛け合わせると結果が整数にすぎないので、これが予想されます。これは、doubleをフィールドの1つとして使用すると結果がdouble値として考慮されます。受信者のデータ型はここでは関係ありません

1

intを2つ掛けた結果は、intです。これは、乗算の値に応じてオーバーフローする場合もありますが、オーバーフローしない場合もあります。この結果が生成されると、オーバーフローが発生した後にのみdoubleにプロモートされます。

オペランドの1つがdoubleである場合、乗算の結果はdoubleになり、intよりはるかに広い範囲が可能になります。

+0

しかし、Ankitの例を見ると、倍精度浮動小数点型(double型)の変数**を置くと、乗数のいずれかが倍数であっても、整数オーバーフローが発生します。 –

+3

@AdInfinitumそれは操作の順序です。2つの整数が最初にオーバーフローした後、doubleで乗算され、昇格されます。 – Li357

+0

@AndrewL。ありがとうございました。あなたが正しいです。あなたのコメントの後、私は括弧の中に最後の2つの乗数(secondValueと1)を入れ、それは正しい答えを返します。 –

関連する問題