long a2 = 100L * 1024 * 1024 * 1024;
En esta operación, sin embargo, al menos un operando es long
. Por lo tanto, la operación se lleva a cabo utilizando una precisión de 64 bits, y el resultado del operador numérico es de tipo long
. El otro operando no largo se amplía al tipo long
por promoción numérica y el valor resultado se almacena a la variable a2
.
long a1 = 100 * 1024 * 1024 * 1024;
La expresión constante de entero simple, el resultado de la expresión se calculó como un tipo int
. El valor calculado, sin embargo, demasiado grande para caber en un entero y, por lo tanto, se desborda, lo que resulta en 0
y se almacena para a1
variable.
Editar: como se solicita en el siguiente comentario:
¿Por qué no se hace negativo?
Porque mientras estaba en cálculo entero El segundo cálculo es equivalente a 25 * 2^32
dónde ^
tiene el significado de poder y 2^32
El valor entero es 0
. Sin embargo, para explicar por qué su valor es 0
: En 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
es un entero negativo (-2147483648
) como es el bit de signo 1
Y por lo tanto 2 ^ 32
es solo una multiplicación de 2
a 2 ^ 31
: un cambio a la izquierda y el bit de signo se convertirá en 0
y de ahí el resultado es 0
.
Revisar la java language specification: 4.2.2: Integer operation
para detalles.