long a2 = 100L * 1024 * 1024 * 1024;
In questa operazione tuttavia almeno un operando lo è long
. Quindi l'operazione viene eseguita utilizzando precisione a 64 bit e il risultato dell'operatore numerico è di tipo long
. L'altro operando non lungo è ampliato per il tipo long
di promozione numerica e il valore derivato viene archiviato in variabile a2
.
long a1 = 100 * 1024 * 1024 * 1024;
L'espressione costante di intero semplice, il risultato dell'espressione è stato calcolato come un tipo int
. Il valore calcolato tuttavia troppo grande per adattarsi a un numero intero e quindi traboccato, risultando 0
e viene immagazzinato a1
variabile.
EDIT: come viene chiesto nel seguente commento:
Perché non diventa negativo?
Perché mentre sei dentro Calcolo intero Il secondo calcolo è equivalente a 25 * 2^32
dove ^
ha il significato del potere e 2^32
Il valore intero è 0
. Tuttavia, per spiegare perché il suo valore è 0
: In binario:
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
è un intero negativo (-2147483648
) come è il bit del segno 1
E quindi 2 ^ 32
è solo una moltiplicazione di 2
a 2 ^ 31
: uno spostamento a sinistra e il bit del segno diventeranno 0
E quindi il risultato è 0
.
Dai un'occhiata al java language specification: 4.2.2: Integer operation
per dettagli.