java隐式长投射行为

时间:2014-12-17 16:09:54

标签: java casting

今天我发现我的一个程序是错误的,因为隐式演员不起作用,更好的说它没有像我期望的那样工作。

我有类似的东西

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?

3 个答案:

答案 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;