1024 * 1024 * 1024 * 1024
e 2147483648
não tem o mesmo valor em Java.
Na verdade, 2147483648
NÃO É UM VALOR (embora2147483648L
seja) em Java. O compilador literalmente não sabe o que é ou como usá-lo. Então, lamenta.
1024
é um int válido em Java e um válido int
multiplicado por outro válido int
, é sempre um válidoint
. Mesmo que não seja o mesmo valor que você esperaria intuitivamente, porque o cálculo transbordará.
Exemplo
Considere o seguinte exemplo de código:
public static void main(String[] args) {
int a = 1024;
int b = a * a * a * a;
}
Você esperaria que isso gerasse um erro de compilação? Torna-se um pouco mais escorregadio agora.
E se colocarmos um loop com 3 iterações e multiplicarmos no loop?
O compilador pode otimizar, mas não pode alterar o comportamento do programa enquanto o faz.
Algumas informações sobre como esse caso é realmente tratado:
Em Java e em muitas outras linguagens, os números inteiros consistem em um número fixo de bits. Cálculos que não cabem no número especificado de bits serão excedidos ; o cálculo é basicamente executado no módulo 2 ^ 32 em Java, após o qual o valor é convertido novamente em um número inteiro assinado .
Outros idiomas ou APIs usam um número dinâmico de bits (BigInteger
em Java), geram uma exceção ou configuram o valor para um valor mágico, como não um número.