有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

强制转换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隐式不应该将这些整数转换为长整数吗


共 (3) 个答案

  1. # 1 楼答案

    在Java中,当使用integers进行计算时,结果总是integer,无论用于分配结果的变量类型如何

    将一个(或全部)数字文字指定为Long是一个不错的选择,因为您已经发现:

    long implicit = 1000L*24*3600*1000;
    

    编辑:如注释中所述,Java中的操作数是从左到右求值的,因此至少应该将左侧的第一个操作数赋值为

  2. # 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. # 3 楼答案

    java implict long cast behaviour

    Java中没有“隐式长强制转换行为”。您必须通过使用长文本或(long)typecast来强制执行它。您的代码没有这样做,因此该值是以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;