long a2 = 100L * 1024 * 1024 * 1024;
Dans cette opération cependant, au moins un opérande est long
. Par conséquent, l'opération est effectuée en utilisant une précision 64 bits, et le résultat de l'opérateur numérique est de type long
. Les autres opérands non longs sont élargis pour type long
par Promotion numérique et la valeur résultante est stockée à la variable a2
.
long a1 = 100 * 1024 * 1024 * 1024;
L'expression constante d'un entier simple, le résultat de l'expression a été calculé comme un type int
. La valeur calculée, cependant, trop grande pour s'adapter dans un entier et donc débordé, ce qui a entraîné 0
et est stocké pour a1
variable.
Edit: comme on le demande dans le commentaire suivant:
Pourquoi ça ne va pas négatif?
Parce que dans calcul entier Le deuxième calcul équivaut à 25 * 2^32
où ^
a le sens du pouvoir et 2^32
La valeur entière est 0
. Cependant, pour expliquer pourquoi sa valeur est 0
: En binaire:
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
est un entier négatif (-2147483648
) Comme le bit du signe est 1
Et donc 2 ^ 32
est juste une multiplication de 2
à 2 ^ 31
: un changement de gauche et le bit de signe deviendra 0
Et donc le résultat est 0
.
Vérifiez java language specification: 4.2.2: Integer operation
pour plus de détails.