Der *-Operator führt bei int keine Anpassung an den Datentypen durch, sodass die Multiplikation von zwei ints wiederum int liefert. Doch das Produkt kann schnell aus dem Wertebereich laufen, sodass es zum Überlauf kommt. Selbst wenn das Produkt in eine long-Variable geschrieben wird, erfolgt die Konvertierung von int in long erst nach der Multiplikation:
int i = Integer.MAX_VALUE * Integer.MAX_VALUE; long l = Integer.MAX_VALUE * Integer.MAX_VALUE; System.out.println( i ); // 1 System.out.println( l ); // 1
Sollen zwei ints ohne Überlauf multipliziert werden, ist einer der beiden Faktoren auf long anzupassen, damit es zum korrekten Ergebnis 4611686014132420609 führt.
System.out.println( Integer.MAX_VALUE * (long) Integer.MAX_VALUE ); System.out.println( (long) Integer.MAX_VALUE * Integer.MAX_VALUE );
Da diese Typanpassung schnell vergessen werden kann und nicht besonders explizit ist, bieten die Klassen Math und StrictMath die statische Methode long multiplyFull(int x, int y), die für uns über (long)x * (long)y die Typumwandlung vornehmen.