【问题标题】:Casting Java long and double sum gives always same result铸造Java long 和 double sum 总是给出相同的结果
【发布时间】:2020-05-14 10:53:29
【问题描述】:

请检查以下Java代码:

public class Test{

  public static void main(String []args){
    long start = 1572544800000L;
    long end = 1635703200000L;
    int d = 10;
    int val = (int)(start + d + end + 0.0);
    // value 2147483647
    System.out.println("value: " + val); 
  }
}

在这里,如果我更改 d 的值,输出总是相同的 2147483647。这是Int 最大值。 如果我将0.0 更改为0,则输出符合预期。

任何人都可以在Java 中解释这种行为

谢谢

【问题讨论】:

    标签: java casting integer-overflow


    【解决方案1】:

    start + d + end 的值太大,无法用int 表示,但又不会太大,无法用longdouble 表示。

    通过使用+ 0.0,您将start + d + end + 0.0 的整个表达式的类型设置为double。所以总的来说,您将double 转换为int

    将太大的double 转换为int 时会发生什么情况? Java Language Specification 5.1.3告诉你答案:

    该值一定是太大(一个大的正值或正无穷大),第一步的结果是int或long类型的最大可表示值。

    如果您使用0,但是,表达式start + d + end + 0 的类型仍然是long,因此您将long 转换为int,这是一种不同的转换。它是这样发生的:

    有符号整数到整数类型 T 的窄化转换只会丢弃除 n 个最低位之外的所有位,其中 n 是用于表示类型 T 的位数。除了可能丢失有关数值,这可能会导致结果值的符号与输入值的符号不同。

    【讨论】:

    • 感谢您的回答,我会检查Narrowing Primitive Conversion 规则。
    【解决方案2】:

    2147483647 = 整数.MAX_VALUE

    试试

    double val = (double)(start + d + end + 0.0);
    

    或者,

    long val = (long)(start + d + end + 0.0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 2011-05-28
      • 2015-12-31
      • 2018-06-17
      • 2015-06-07
      • 1970-01-01
      相关资源
      最近更新 更多