2009-09-18 66 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