1024 * 1024 * 1024 * 1024y 2147483648no tienen el mismo valor en Java.
En realidad, 2147483648 NO ES UN VALOR (aunque lo 2147483648Lsea) en Java. El compilador literalmente no sabe qué es ni cómo usarlo. Entonces se queja.
1024es un int válido en Java, y un válido intmultiplicado por otro válido int, siempre es válido int. Incluso si no es el mismo valor que esperaría intuitivamente porque el cálculo se desbordará.
Ejemplo
Considere el siguiente ejemplo de código:
public static void main(String[] args) {
int a = 1024;
int b = a * a * a * a;
}
¿Esperaría que esto generara un error de compilación? Ahora se vuelve un poco más resbaladizo.
¿Qué pasa si ponemos un ciclo con 3 iteraciones y multiplicado en el ciclo?
El compilador puede optimizar, pero no puede cambiar el comportamiento del programa mientras lo hace.
Alguna información sobre cómo se maneja realmente este caso:
En Java y muchos otros lenguajes, los enteros consistirán en un número fijo de bits. Los cálculos que no caben en el número de bits dado se desbordarán ; el cálculo se realiza básicamente módulo 2 ^ 32 en Java, después de lo cual el valor es de nuevo convertida en un firmado entero.
Otros lenguajes o API utilizan un número dinámico de bits ( BigIntegeren Java), generan una excepción o establecen el valor en un valor mágico como no un número.