今天我发现我的一个程序是错误的,因为隐式演员不起作用,更好的说它没有像我期望的那样工作。
我有类似的东西
long normal = 1000*24*3600*1000;
System.out.println("normal :"+normal);
正常:500.654.080
询问excel正确的计算输出应该是86.400.000.000;
我去了java manual,长数据类型的最大值应为2 ^ 63-1,即:9.223.372.036.854.780.000
然后我试图强制演员长,似乎有效:
long normal = 1000*24*3600*1000;
long explicit = 1000*24*3600*1000l; // 1000l <- letter L used at the end for long
long cast = 1000*(long)(24*3600*1000);
System.out.println("normal :"+normal);
System.out.println("explicit :"+explicit );
System.out.println("cast :"+cast);
正常:500.654.080
显式:86.400.000.000
施放:86.400.000.000
我认为正在发生的是,java在integer overflow发生的某个点上将计算作为整数运行。
不应该Java隐式地将那些整数转换为long?
答案 0 :(得分:3)
在Java中,使用integers
进行计算时,无论用于分配结果的变量类型如何,结果始终为integer
。
将一个(或所有)数字文字指定为Long是可行的方法,因为您已经发现了自己:
long implicit = 1000L*24*3600*1000;
编辑:如评论中所述,Java中的操作数从左到右进行评估,因此至少应将左侧的第一个操作数指定为Long
答案 1 :(得分:2)
当您使用不带L
后缀的数字时,Java会将其解释为integers
,即语言中的默认数字。计算将始终在int
中完成,因此您将遇到溢出。
如果您投射或使用明确的long
值,则计算中的所有值都会被提升和/扩展为长值。这在语言规范中描述:
http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.6.2
在赋值给变量(类型为long
)之前计算表达式,因此Java不知道溢出并且在第一个示例中没有提升任何内容。
答案 2 :(得分:2)
java暗示长期投射行为
没有 &#39;隐式长期投射行为&#39;在Java中。您必须使用长文字或(long)
类型转换来自行执行。您的代码没有这样做,因此该值以int
精度计算。如果您想要long
精度,请执行以下操作之一:
long normal = 1000L*24*3600*1000;
long normal = 1000*24L*3600*1000;
long normal = 1000*24*3600L*1000;
long normal = 1000*24*3600*1000L;
long normal = (long)1000*24*3600*1000;
long normal = 1000*(long)24*3600*1000;
long normal = 1000*24*(long)3600*1000;
long normal = 1000*24*3600*(long)1000;