我的问题看起来很简单。
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的范围问题。 但是不应该把产品长期隐含在线上吗? 我在这里错过了什么? 我知道如何使用Math.pow(双,双)函数,它完美地工作。但 我想知道上面输出的原因。
TIA。
答案 0 :(得分:4)
在第一种情况下,结果首先计算为int
,然后才转换为long
。
因此错误的结果。
在第二种情况下,i
在计算结果之前会转换为long
,因为(long)
(强制转换为long
)的优先级高于*
}。
因此结果正确。
答案 1 :(得分:3)
您已成为运营商优先级错误的牺牲品。这一行:
long square = (long) i*i;
实际上是这样做的:
long square = ((long) i)*i;
这很重要,因为当你乘以99999时,得到的数字太大而无法表示为int
。这一行:
long square = i*i;
正方形i
,导致溢出错误,然后将结果转换为long
并将其分配给square
。另一行将第一个因子投射到long
,迫使它在计算发生之前将第二个因子投射到long
。