1024 * 1024 * 1024 * 1024
y 2147483648
no tienen el mismo valor en Java.
En realidad, 2147483648
NO ES UN VALOR (aunque lo 2147483648L
sea) en Java. El compilador literalmente no sabe qué es ni cómo usarlo. Entonces se queja.
1024
es un int válido en Java, y un válido int
multiplicado 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 ( BigInteger
en Java), generan una excepción o establecen el valor en un valor mágico como no un número.