int(primitive)值没有被隐式地转换为long(primitive)

时间:2015-06-24 20:32:48

标签: java int long-integer

我的问题看起来很简单。

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。

2 个答案:

答案 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