回答
已經嘗試了一個簡單的程序(同時使用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規定
,但是這並不完全是一回事。
也許有人用銳利的眼睛比我能找到一個有保障的地方......
最後3應該是相同的。右側的文字已經是雙。當你有一個十進制文字時,'d'或'D'是隱含的。
第一個是稍有不同在於0是一個int的文本,這將被擴大至兩倍。我不知道在這種情況下甚至是否產生不同的字節碼;無論如何,結果應該是相同的。
謝謝你的回覆,我知道結果是一樣的,我想知道引擎蓋下的差異。 – 2009-09-18 09:02:28
對於「0.0」,「0.0d」和「0.0D」,引擎蓋上確實沒有區別。這是寫出雙重字面的三種方式,它們都完全相同。 – Jesper 2009-09-18 10:32:03
爲Java我不知道到底,在C,如果你在最後省略此d,因爲它不會改變高位字節,它可以有效果這可能是非常危險的,在你的變數就在於,你居然沒有號碼投放!
在Java中我有一個非常大的問題,instatntiating BigDecimal的 - 新的BigDecimal(0)和新的BigDecimal(0L)是不一樣的東西,你能感覺到它,如果你的代碼與Java 1.4遷移到Java 1.5。不知道他們爲什麼這麼粗魯,也許他們必須這樣做。
你的回答沒有回答這個問題。 C中發生了什麼並不相關,您對BigDecimals的體驗也不相關。 – 2015-01-15 16:53:02
對於第一種:
double dummy = 0;
的整數文字0
轉換爲雙用寬元轉換,參見Java語言規範中的5.1.2 Widening Primitive Conversion。請注意,這完全由編譯器完成,它對生成的字節碼沒有任何影響。
對於其他的:
double dummy = 0.0;
double dummy = 0.0d;
double dummy = 0.0D;
這三者是完全一樣的 - 0.0
,0.0d
和0.0D
只有三個寫double
字面的不同方式。請參閱JLS中的3.10.2 Floating-Point Literals。
- 1. Java的雙支柱初始化
- 2. Java雙重初始化爲0.0
- 3. 雙括弧初始化在java中
- 4. java中的初始化初始化
- 5. 雙括號初始化
- 6. 初始化在Java
- 7. Java T初始化
- 8. Java初始化塊
- 9. 雙括弧初始化和系列化
- 10. 的Java創建初始化
- 11. 的Java初始化對象
- 12. 在java中初始化雙變量的最安全的方法
- 13. C++雙陣列初始化錯誤
- 14. C:初始化參考變量雙
- 15. 雙括號初始化類型混淆
- 16. 初始化字符串用雙引號
- 17. 靜態初始化的Java序列化
- 18. Java字段初始化
- 19. Java對象初始化
- 20. java:變量初始化
- 21. Java Arraylist重新初始化
- 22. 初始化Java變量
- 23. 初始化Java數組
- 24. 用Java初始化Map,Hashmap
- 25. Java初始化問題
- 26. Java:如何初始化String []?
- 27. Java:條件初始化?
- 28. Java玩家板初始化
- 29. Java變量值初始化
- 30. Java變量動初始化
你可以建議一個很好的資源,在哪裏可以閱讀關於ldc2_w和其他指令的含義? – 2009-09-18 09:39:51
JVM規範:http://java.sun.com/docs/books/jvms/ – 2009-09-18 09:46:26