2016-10-08 36 views
3

我在以下方案中難以理解java的行爲。例如,我有一個乘法方法,它只是乘以兩個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的乘法大得多的值。

我對這個問題的問題是;

1-爲什麼整數溢出發生,雖然結果被分配給一個double?

2-當我將secondValue的類型更改爲double(在註釋中提到)時,結果是正確的。爲什麼Java的行爲不同時,其中一個乘數的類型改爲double?

+4

計算是以整數形式進行的,只有在計算後纔會將結果轉換爲double。所以有一個時刻你的int是MAX_VALUE的兩倍,這會產生你的結果 – baao

+0

乘法只涉及整數,所以它是作爲整數乘法完成的。只有一次完成後,結果纔會翻倍,但那時已經太晚了。轉換乘法中的一個值。 – 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個整數時,結果只是一個整數。當你使用雙精度作爲場的一個結果將被視爲雙精度值時,它與其他方式一起工作。接收器的數據類型在這裏並不重要

1

乘以兩個int s的結果是一個int,根據乘法的值,該結果可能溢出也可能不溢出。一旦產生這個結果,在發生溢出之後,纔會將其提升爲double

如果其中一個操作數是double,則乘法的結果將是double,它允許比int大得多的範圍。

+0

但是,如果你看看Ankit的例子。在計算結束時,如果將變量** 1,即double加1,即使乘法器中的一個是雙精度值,仍然會發生整數溢出。 –

+3

@AdInfinitum這是因爲操作順序。兩個整數首先溢出,然後乘以一個double並提升。 – Li357

+0

@AndrewL。謝謝。你是對的。在你的評論之後,我把最後兩個乘數(secondValue和one)放在一個括號中,它給出了正確的答案。 –

相關問題