2016-07-07 14 views
3

SSCCE:为什么长时间在Java中翻番?

public class Test { 

    public static void main(String[] args) { 
     Long a = new Long(1L); 
     new A(a); 
    } 

    static class A { 
     A(int i) { 
      System.out.println("int"); 
     } 

     A(double d) { 
      System.out.println("double"); 
     } 
    } 
} 

输出:

double 

不会有任何编译错误印刷,它工作正常,并呼吁double -parameter构造。但是为什么?

回答

8

归类于促销规则:long转换为double,优先于int

一个long总是可以放入一个double虽然如果long大于2的第53届功率较大精密可以丢失那么你的编译器采double构造一个比一个int更适合。

(编译器不使在这个意义上,1L确实安装到了int一个动态检查)。

+0

我理解“合适”的事情,我不明白为什么没有编译错误? – SeniorJD

+0

您不会收到错误,因为这不是错误。编译器可能会警告你,尽管可能有损耗转换。 – Bathsheba

+0

例如,在C++中会出现编译错误,如果你试图把'long long'值放到'int'或'double'构造函数 – SeniorJD

1

int是4个字节,其中作为longdouble是8个字节

所以,这是很明显的,有针对的4个字节的数据丢失的机会,如果它是铸造到一个int。数据类型总是上传。正如来自@Bathsheba的评论所提到的,即使在使用double的情况下也有数据丢失的可能性,但与int相比,损失更小。

Double bits

正如你可以看到,双用途用于存储显著位数52位。如果它选择int,变量将有32位可用。因此,jvm选择double而不是int。

来源:Wikipedia