回答
已经尝试了一个简单的程序(同时使用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. 双括号初始化
- 7. 双括号初始化
- 8. Java T初始化
- 9. Java类初始化
- 10. 初始化在JAVA
- 11. 初始化在Java
- 12. Java初始化块
- 13. JAVA初始化块
- 14. Java双大括号初始化始终工作?
- 15. 双括弧初始化和系列化
- 16. Java的ArrayList的初始化
- 17. 的Java初始化对象
- 18. 的Java创建初始化
- 19. Mat初始化的双指针
- 20. 在java中初始化双变量的最安全的方法
- 21. 双循环变量初始化
- 22. 双大括号初始化 - 优点
- 23. 双括号初始化类型混淆
- 24. 初始化字符串用双引号
- 25. 双(调度程序)bean初始化
- 26. C:初始化参考变量双
- 27. C++双阵列初始化错误
- 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