long a2 = 100L * 1024 * 1024 * 1024;
Nesta operação, no entanto, pelo menos um operando é long
. Portanto, a operação é realizada usando precisão de 64 bits e o resultado do operador numérico é do tipo long
. O outro operando não longo é ampliado para digitar long
por Promoção numérica e o valor resultante é armazenado para variável a2
.
long a1 = 100 * 1024 * 1024 * 1024;
A expressão constante de número inteiro simples, o resultado da expressão foi calculado como um tipo int
. O valor calculado, porém grande demais, para caber em um número inteiro e, portanto, transbordado, resultando em 0
e é armazenado para a1
variável.
EDIT: Como é perguntado no seguinte comentário:
Por que não é negativo?
Porque enquanto entra Computação inteira o segundo cálculo é equivalente a 25 * 2^32
Onde ^
tem o significado do poder e 2^32
O valor inteiro é 0
. No entanto, para explicar por que seu valor é 0
: Em binário:
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
é um número inteiro negativo (-2147483648
) como a parte do sinal é 1
E, portanto 2 ^ 32
é apenas uma multiplicação de 2
para 2 ^ 31
: um turno esquerdo e a parte do sinal se tornará 0
e, portanto, o resultado é 0
.
Confira o java language specification: 4.2.2: Integer operation
para detalhes.