class Main {
public static void main (String[] args){
long value = 1024 * 1024 * 1024 * 80;
System.out.println(Long.MAX_VALUE);
System.out.println(value);
}
}
Output is:
9223372036854775807 0
It's correct if long value = 1024 * 1024 * 1024 * 80L;
!
In Java, all math is done in the largest data type required to handle all of the current values. So, if you have int * int, it will always do the math as an integer, but int * long is done as a long.
In this case, the 1024*1024*1024*80 is done as an Int, which overflows int.
The "L" of course forces one of the operands to be an Int-64 (long), therefore all the math is done storing the values as a Long, thus no overflow occurs.
The integer literals are int
s. The int
s overflow. Use the L
suffix.
long value = 1024L * 1024L * 1024L * 80L;
If the data came from variables either cast or assign to longs beforehand.
long value = (long)a * (long)b;
long aL = a;
long bL = b;
long value = aL*bL
Strictly speaking you can get away with less suffices, but it's probably better to be clear.
Also not the lowercase l
as a suffix can be confused as a 1
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With