1024 * 1024 * 1024 * 1024
und 2147483648
haben nicht den gleichen Wert in Java.
Tatsächlich ist es in Java 2147483648
nicht einmal ein Wert (obwohl dies der Fall2147483648L
ist). Der Compiler weiß buchstäblich nicht, was es ist oder wie man es benutzt. Also jammert es.
1024
ist ein gültiges int in Java und ein gültiges int
multipliziert mit einem anderen gültigen int
ist immer ein gültiges int
. Auch wenn es nicht derselbe Wert ist, den Sie intuitiv erwarten würden, da die Berechnung überläuft.
Beispiel
Betrachten Sie das folgende Codebeispiel:
public static void main(String[] args) {
int a = 1024;
int b = a * a * a * a;
}
Würden Sie erwarten, dass dies einen Kompilierungsfehler erzeugt? Es wird jetzt etwas rutschiger.
Was ist, wenn wir eine Schleife mit 3 Iterationen setzen und in der Schleife multiplizieren?
Der Compiler kann zwar optimieren, das Verhalten des Programms jedoch nicht ändern.
Einige Informationen darüber, wie dieser Fall tatsächlich behandelt wird:
In Java und vielen anderen Sprachen bestehen Ganzzahlen aus einer festen Anzahl von Bits. Berechnungen, die nicht in die angegebene Anzahl von Bits passen, laufen über . Die Berechnung wird grundsätzlich in Java Modul 2 ^ 32 durchgeführt, wonach der Wert wieder in eine vorzeichenbehaftete Ganzzahl umgewandelt wird.
Andere Sprachen oder APIs verwenden eine dynamische Anzahl von Bits ( BigInteger
in Java), lösen eine Ausnahme aus oder setzen den Wert auf einen magischen Wert, z. B. keine Zahl.