Java的双初始化(Java double initialization)

2019-07-18 11:35发布

以何种方式是这些语句有什么不同?

  1. 双虚设= 0;
  2. 双虚设= 0.0;
  3. 双虚设= 0.0D;
  4. 双虚设= 0.0D;

Answer 1:

尝试过一个简单的程序(同时使用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节 ,但是这并不完全是一回事。

也许有人比我更锐利的眼睛能找到一个保证那里的某个地方......



Answer 2:

对于第一种:

double dummy = 0;

字面整数0被转换为一个双带加宽原语转换,请参见5.1.2加宽原语转换在Java语言规范。 请注意,这是由编译器完全完成,它并没有对所产生的字节码的任何影响。

对于其他的人:

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

这三个是完全一样的- 0.00.0d0.0D只有三个写一个不同的方式double文字。 见3.10.2浮点文本在JLS。



Answer 3:

最后3应该是相同的。 在右侧的文字已经是一个双。 在“D”或“d”是隐含的,当你有一个十进制文本。

第一个是稍有不同在于0是一个int的文本,这将被扩大至两倍。 我不知道,即使产生在这种情况下还是不不同的字节码; 结果应该是相同的反正。



Answer 4:

为Java我并不确切地知道,在C这可能是非常危险的,如果你在最后省略此d,因为它不会改变高位字节,它可以在您的变量在于,你居然没有把在数量上的效果!

在Java中我有一个非常大的问题,instatntiating BigDecimal的 - 新的BigDecimal(0)和新的BigDecimal(0L)是不一样的东西,你能感觉到它,如果你的代码与Java 1.4迁移到Java 1.5。 不知道为什么,他们马虎吧,也许他们不得不这样做的。



文章来源: Java double initialization