Reputation: 9
My question appears very simple.
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
It looks to be the range issue of int. But shouldn't it typecast the product to long implicitly? What am I missing here? I know how to use Math.pow(double,double) function and it works perfectly. But I want to know the reason for above output.
TIA.
Upvotes: 0
Views: 126
Reputation: 53839
In the first case, the result is first computed as an int
, and only then converted to a long
.
Therefore the wrong result.
In the second case, i
is converted to a long
before computing the result because (long)
(cast to long
) has a higher precedence than *
.
Therefore the right result.
Upvotes: 4
Reputation: 13334
You have fallen prey to an operator precedence error. This line:
long square = (long) i*i;
actually does this:
long square = ((long) i)*i;
This is important, because when you multiply 99999, you get a number too large to represent as an int
. This line:
long square = i*i;
squares i
, causing an overflow error, then casts the result to a long
and assigns it to square
. The other line casts the first factor to a long
, forcing it to cast the second factor to a long
as well, before the calculation takes place.
Upvotes: 3