java暗示长期投射行为

SQL*_*ion 11 java casting

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

我有这样的事情

long normal = 1000*24*3600*1000;
System.out.println("normal :"+normal);
Run Code Online (Sandbox Code Playgroud)

正常:500.654.​​080

询问excel正确的计算输出应该是86.400.000.000;

我去了java手册,长数据类型的最大值应该是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);
Run Code Online (Sandbox Code Playgroud)

正常:500.654.​​080

显式:86.400.000.000

演员:86.400.000.000

我认为正在发生的是,java在整数溢出发生时将计算作为整数运算.

Java隐式不应该将那些整数转换为长整数?

jer*_*ter 3

在 Java 中,当使用 进行计算时,无论用于分配结果的变量的类型如何,结果都integers将始终为。integer

将一个(或全部)数字文字分配为 Long 是一种可行的方法,正如您自己已经发现的那样:

long implicit = 1000L*24*3600*1000;
Run Code Online (Sandbox Code Playgroud)

编辑:如注释中所述,Java 中的操作数是从左到右计算的,因此至少左侧的第一个操作数应指定为 Long

  • 实际上比这更糟糕:在 Java 中,表达式(同等优先级)是从左到右计算的。因此,你很幸运,溢出只发生在最后一次乘法中。`1000 * 24 * 3600 * 1000 * 1L`也会溢出。我建议您将所有操作数设为“长”文字,以明确您的意图。最后一个操作数为“long”且前面的操作数为“int”的表达式肯定会引起我的注意。 (3认同)
  • @5gon12eder 或者只在第一个元素上使用文字“long”。 (2认同)
  • 另外,完全偏离主题,我建议不要在那里使用小写 l ,它看起来太像第一个了。请改用大写字母。 (2认同)