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)函数,它工作得很好。但是 我想知道以上输出的原因
蒂娅
# 1 楼答案
在第一种情况下,结果首先计算为
int
,然后才转换为long
因此,结果是错误的
在第二种情况下,在计算结果之前,将
i
转换为long
,因为(long)
(强制转换为long
)的优先级高于*
因此,这是正确的结果
# 2 楼答案
您已成为运算符优先级错误的牺牲品。这一行:
实际上是这样的:
这一点很重要,因为当你乘以99999时,你会得到一个太大的数字,不能用
int
来表示。这一行:平方
i
,导致溢出错误,然后将结果强制转换为long
,并将其分配给square
。另一行将第一个因子强制转换为long
,迫使它在计算之前也将第二个因子强制转换为long