为什么在Java中长浇铸为双倍?
SSCCE:为什么在Java中长浇铸为双倍?,java,double,long-integer,Java,Double,Long Integer,SSCCE: 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) {
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
输出:
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
不会打印编译错误,它工作正常并调用双参数构造函数。但是为什么呢?这取决于类型提升的规则:一个
long
被转换成double
,而不是int
long
始终可以放入double
,但如果long
大于2的53次方,则可能会丢失精度。因此,编译器选择的double
构造函数比int
构造函数更合适
(编译器不会进行动态检查,即1L
是否适合int
)。因为long不适合int
Check
int
为4字节,其中aslong
和double
为8字节
因此,很明显,如果将数据强制转换为int,则有可能丢失4字节的数据。数据类型总是向上强制转换。正如@Bathsheba的评论所提到的,即使使用double,数据也有可能丢失,但与int相比,丢失的数据要小得多
如您所见,double使用52位来存储有效数字。如果选择int,变量将有32位可用。因此jvm选择double而不是int
来源:将
long
转换为int
是一个错误,因为它可能会丢失值的整体大小。将long
转换为double
是一个很好的选择
编译器将自动生成参数的转换。这包括扩大基本体转换,但不包括缩小基本体转换。因为带有
int
参数的方法需要缩小转换,所以它不适用于调用。我理解“fit”的意思,我不明白为什么没有编译错误?因为它不是错误,所以不会出现错误。编译器可能会警告您可能有损转换。例如,在C++中,如果尝试将<代码>长Lo/<代码>值放在<代码> int <代码>或<代码>双< /COD>构造函数,将出现编译错误。