long a2 = 100L * 1024 * 1024 * 1024;
In diesem Vorgang ist jedoch mindestens ein Operand long
. Daher wird der Betrieb mit 64-Bit-Präzision durchgeführt, und das Ergebnis des numerischen Operators ist vom Typ long
. Der andere nicht lange Operand wird auf Typ erweitert long
durch Numerische Werbung und führte den Wert, der auf Variable gespeichert wird a2
.
long a1 = 100 * 1024 * 1024 * 1024;
Der konstante Expression der einfachen Ganzzahl wurde das Ergebnis des Ausdrucks als Typ berechnet int
. Der berechnete Wert jedoch zu groß, um in eine Ganzzahl zu passen, und daher überflutet, was dazu führt, dass 0
und wird auf gespeichert a1
Variable.
Bearbeiten: Wie im folgenden Kommentar gefragt:
Warum wird es nicht negativ?
Weil während Ganzzahlberechnung Die zweite Berechnung entspricht zu 25 * 2^32
wo ^
hat die Machtbedeutung und 2^32
ganzzahliger Wert ist 0
. Aber zu erklären, warum der Wert ist 0
: In binär:
100 * 1024 * 1024 * 1024 == 25 * 2^32;
Integer.MAX_VALUE = 2 ^ 31 -1 = 0 11111111 11111111 11111111 1111111
Integer.MAX_VALUE + 1 = 2 ^ 31 = 1 00000000 00000000 00000000 0000000
2 ^ 31
ist eine negative Ganzzahl (-2147483648
) Wie das Zeichenbit ist 1
Und daher 2 ^ 32
ist nur eine Multiplikation von 2
zu 2 ^ 31
: Eine linke Verschiebung und das Zeichenbit wird werden 0
und daher ist das Ergebnis 0
.
Probier das aus java language specification: 4.2.2: Integer operation
für Details.