有 Java 编程相关的问题?

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

java int(primitive)值未隐式类型转换为long(primitive)

我的问题似乎很简单

int i =99999;
long square = i*i;
System.out.println(square);   //prints 1409865409 - incorrect value

int i = 99999;
long square = (long) i*i;
System.out.println(square);  // prints 9999800001 - correct value

看起来是int的范围问题。 但它不应该隐式地将产品类型化为long吗? 我错过了什么? 我知道如何使用数学。pow(double,double)函数,它工作得很好。但是 我想知道以上输出的原因

蒂娅


共 (2) 个答案

  1. # 1 楼答案

    在第一种情况下,结果首先计算为int,然后才转换为long

    因此,结果是错误的


    在第二种情况下,在计算结果之前,将i转换为long,因为(long)(强制转换为long)的优先级高于*

    因此,这是正确的结果

  2. # 2 楼答案

    您已成为运算符优先级错误的牺牲品。这一行:

    long square = (long) i*i;
    

    实际上是这样的:

    long square = ((long) i)*i;
    

    这一点很重要,因为当你乘以99999时,你会得到一个太大的数字,不能用int来表示。这一行:

    long square = i*i;
    

    平方i,导致溢出错误,然后将结果强制转换为long,并将其分配给square。另一行将第一个因子强制转换为long,迫使它在计算之前也将第二个因子强制转换为long