Java double 初始化

39
这些语句有何不同之处?
1. double dummy = 0; 2. double dummy = 0.0; 3. double dummy = 0.0d; 4. double dummy = 0.0D;
3个回答

29

尝试了一个简单的程序(同时使用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;
根据第5.2节的规定,但并不完全相同。也许比我更敏锐的人可以在那里找到保证...

你能推荐一个好的资源,让人们了解ldc2_w和其他指令的含义吗? - Alberto Zaccagni
ldc2_w将一个双字常量值推送到操作数栈上。ldc2_w只有一个参数<value>,它是要推送的双字项。 - SkarmoutsosV

21

对于第一个问题:

double dummy = 0;

整数字面值0通过扩大基本类型转换转换为double。请参见Java语言规范中的5.1.2 扩展基本类型转换。请注意,这完全是由编译器完成的,它不会对生成的字节码产生任何影响。

对于其他的:

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

这三个是完全相同的 - 0.0, 0.0d, 和 0.0D 只是写一个 double 字面值的三种不同方式。请参考 JLS 中的3.10.2 浮点字面值


0d 是什么意思? - J'e
1
@J'e仍然完全相同,只是写double字面量的另一种方式。 - Jesper

3
最后三个应该是相同的。右侧的文字已经是一个 double 类型了,'d' 或 'D' 在有小数点的情况下是可以省略的。
第一个稍微不同,因为 0 是一个 int 类型的字面量,会被扩展为 double 类型。我不知道在这种情况下是否会产生不同的字节码,但结果应该是相同的。

谢谢您的回复,我知道结果是相同的,但我想了解底层的区别。 - Alberto Zaccagni
对于 "0.0"、"0.0d" 和 "0.0D",在底层实际上没有任何区别。它们都是表示 double 字面量的三种写法,完全等价。 - Jesper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接