2014-03-06 115 views
3

取這兩個片段,例如:爪哇類型轉換混亂

情況1:

Scanner s = new Scanner(System.in); 
int n = s.nextInt(); /** take user input **/ 

n *= Double.NEGATIVE_INFINITY; 

情況2:

int k=10; 
double kk = 10.10; 

int rst = k*kk; 

在這兩種情況下,我沒有做任何類型從我身邊,但案例1正確執行並打印n的值,但案例2拋出一個錯誤,can not convert from double to int。爲什麼這個區別?

+0

因爲'* ='(和'+ ='和它的親屬)在左參數的類型來計算。然而''''「促進」參數到「最寬」參數的類型。 –

+0

@zapl:同樣的錯誤! – NoobEditor

+2

因爲'n * = Double.NEGATIVE_INFINITY'是'n =(int)(n * Double.NEGATIVE_INFINITY)' – johnchen902

回答

5

第一部作品和第二個沒有因爲*=+=-=增加一個自動施放

例如,如果您要將第二個示例更改爲;

int k=10; 
double kk = 10.10; 
k*= kk; 

它應該工作。或者你可以只添加一個明確鑄像這樣rst = (int)(k*kk);

0

將整數(int)與java中的浮點數相乘的結果總是會導致浮點數(double)。您正在將此結果分配給需要投射的整數rst

+0

是不是發生在'情況1'同樣的事情?乘法值被分配回'int'? – NoobEditor

+0

@NoobEditor - 是的,很對。 –

1

,當你與不同的數據類型的兩個變量應用算術 操作算術促進Java的發生。在這種情況下, 編譯器會將二進制運算符 中一個操作數的數據類型轉換爲另一個操作數的類型。

在你的情況下,爲了乘以一個int和一個double,int被提升爲double,結果是double。所以,它不能存儲到一個int。

多見於:http://www.codemiles.com/java/arithmetic-promotion-t3487.html#sthash.sdHtt7pG.dpuf