javaint

Why maximum integer number multiplication gives 1 as result


I think much explanation is not required, why below calculation gives result as 1?

int a = 2147483647;
int b = 2147483647;

int c = a * b;
long d = a * b;
double e = a * b;

System.out.println(c);  //1
System.out.println(d);  //1
System.out.println(e);  //1.0

Solution

  • The binary representation of the integer number 2147483647 is as follows:

    01111111 11111111 11111111 11111111
    

    Multiplying this with itself results in the number 4611686014132420609 whose binary representation is:

    00111111 11111111 11111111 11111111 00000000 00000000 00000000 00000001
    

    This is too large for the int type which has only 32 bits. The multiplication of a * b is done as an integer multiplication only, regardless of the variable's type to which the result is assigned (which might do a widening conversion, but only after the multiplication).

    So, the result simply cuts off all bits that do not fit into the 32 bits, leaving only the following result:

    00000000 00000000 00000000 00000001
    

    And this simply is the value 1.

    If you want to keep the information, you must do the multiplication with the long type which has 64 bits:

    long a = 2147483647;
    long b = 2147483647;
    long mult = a * b;
    
    System.out.println((int) mult);     // 1
    System.out.println(mult);           // 4611686014132420609
    System.out.println((double) mult);  // 4.6116860141324206E18
    

    If you need more bits for a calculation you might consider BigInteger (for integer numbers) or BigDecimal (for decimal numbers).