强制转换java隐式长强制转换行为
今天我发现我的一个程序有问题,因为隐式演员阵容没有发挥作用,最好说它没有发挥我预期的作用
我吃过类似的东西
long normal = 1000*24*3600*1000;
System.out.println("normal :"+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);
normal :500.654.080
explicit :86.400.000.000
cast :86.400.000.000
我认为正在发生的是,java在integer overflow发生的某个点作为整数进行计算
Java隐式不应该将这些整数转换为长整数吗
# 1 楼答案
在Java中,当使用
integers
进行计算时,结果总是integer
,无论用于分配结果的变量类型如何将一个(或全部)数字文字指定为Long是一个不错的选择,因为您已经发现:
编辑:如注释中所述,Java中的操作数是从左到右求值的,因此至少应该将左侧的第一个操作数赋值为
# 2 楼答案
当使用不带
L
后缀的数字时,Java会将其解释为integers
,这是语言中的默认数字。计算也总是在int
中完成,因此您将体验溢出如果您强制转换或使用显式
long
值,则计算中的所有值都会“升级”或加宽为长值。语言规范中描述了这一点:http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.6.2
表达式在赋值给变量(变量的类型为
long
)之前进行求值,因此Java不知道溢出,在第一个示例中也不会升级任何内容# 3 楼答案
Java中没有“隐式长强制转换行为”。您必须通过使用长文本或
(long)
typecast来强制执行它。您的代码没有这样做,因此该值是以int
精度计算的。如果想要long
精度,请执行以下操作之一: