2009-09-18 69 views

回答

22

已經嘗試了一個簡單的程序(同時使用0和100來顯示「特殊」常量與常規常量之間的差異),Sun Java 6編譯器將爲1和2輸出相同的字節碼(情況3和4爲就編譯器而言,與2相同)。

因此,例如:

double x = 100; 
double y = 100.0; 

編譯爲:

0: ldc2_w #2; //double 100.0d 
3: dstore_1 
4: ldc2_w #2; //double 100.0d 
7: dstore_3 

不過,我看不到在Java語言規範任何保證常量表達式的這個編譯時擴大。有編譯時縮小的情況下,像:

byte b = 100; 
section 5.2規定

,但是這並不完全是一回事。

也許有人用銳利的眼睛比我能找到一個有保障的地方......

+0

你可以建議一個很好的資源,在哪裏可以閱讀關於ldc2_w和其他指令的含義? – 2009-09-18 09:39:51

+2

JVM規範:http://java.sun.com/docs/books/jvms/ – 2009-09-18 09:46:26

2

最後3應該是相同的。右側的文字已經是雙。當你有一個十進制文字時,'d'或'D'是隱含的。

第一個是稍有不同在於0是一個int的文本,這將被擴大至兩倍。我不知道在這種情況下甚至是否產生不同的字節碼;無論如何,結果應該是相同的。

+0

謝謝你的回覆,我知道結果是一樣的,我想知道引擎蓋下的差異。 – 2009-09-18 09:02:28

+0

對於「0.0」,「0.0d」和「0.0D」,引擎蓋上確實沒有區別。這是寫出雙重字面的三種方式,它們都完全相同。 – Jesper 2009-09-18 10:32:03

-2

爲Java我不知道到底,在C,如果你在最後省略此d,因爲它不會改變高位字節,它可以有效果這可能是非常危險的,在你的變數就在於,你居然沒有號碼投放!

在Java中我有一個非常大的問題,instatntiating BigDecimal的 - 新的BigDecimal(0)和新的BigDecimal(0L)是不一樣的東西,你能感覺到它,如果你的代碼與Java 1.4遷移到Java 1.5。不知道他們爲什麼這麼粗魯,也許他們必須這樣做。

+1

你的回答沒有回答這個問題。 C中發生了什麼並不相關,您對BigDecimals的體驗也不相關。 – 2015-01-15 16:53:02

13

對於第一種:

double dummy = 0; 

的整數文字0轉換爲雙用寬元轉換,參見Java語言規範中的5.1.2 Widening Primitive Conversion。請注意,這完全由編譯器完成,它對生成的字節碼沒有任何影響。

對於其他的:

double dummy = 0.0; 
double dummy = 0.0d; 
double dummy = 0.0D; 

這三者是完全一樣的 - 0.00.0d0.0D只有三個寫double字面的不同方式。請參閱JLS中的3.10.2 Floating-Point Literals