Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiplying long values?

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;!

like image 302
Jonhnny Weslley Avatar asked Sep 29 '09 20:09

Jonhnny Weslley


2 Answers

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.

like image 188
Erich Avatar answered Oct 11 '22 06:10

Erich


The integer literals are ints. The ints 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.

like image 37
Tom Hawtin - tackline Avatar answered Oct 11 '22 07:10

Tom Hawtin - tackline