tipos - Cálculo del rango de primitivas de Java
tipos primitivos java (2)
El compilador, en este caso, evaluará el cálculo (porque contiene solo constantes) e intentará asignar el resultado a la variable. Este cálculo se realiza con tipo int
y solo se convierte en short
en la asignación, si es posible.
En su caso, el primer cálculo es demasiado grande para caber en un short
( 1073741824
). El segundo desbordará el int
y terminará en un rango que admite short
( 0
). Entonces la asignación funciona en ese caso.
Eso sí, es probable que nunca quieras confiar en estas cosas en el código.
Esta pregunta ya tiene una respuesta aquí:
En Java cuando declaramos
short number=1024*1024*1024;
dará error de tiempo de compilación, pero
short number=1024 * 1024 * 1024 * 1024;
compila bien ¿Por qué pasó esto?
Usted está enfrentando el problema a medida que su número se va envolviendo . En el primer caso, no se ajusta y, por lo tanto, se desborda el rango de corto. Pero en el segundo caso se envuelve después del cálculo y, por lo tanto, viene en el rango de corto, por lo que no tiene el error de tiempo de compilación.
Una pérdida de precisión significa que está perdiendo información del valor dado. ( El tipo de datos cortos es un entero complementario de dos firmado de 16 bits. Tiene un valor mínimo de -32.768 y un valor máximo de 32.767 (incluido). En su primer caso, el rango de corto se cruza (1073741824) y, por lo tanto, está perdiendo la información.
Una conversión de estrechamiento de un entero con signo a un tipo integral T simplemente descarta todos menos los n bits de orden más bajo, donde n es el número de bits utilizados para representar el tipo T.
EDITAR:-
De JLS §3.10.1 (muy correctamente mencionado en esta pregunta similar)
Es un error en tiempo de compilación si un literal decimal de tipo int es mayor que 2147483648 (2 31 ), o si el literal decimal 2147483648 aparece en cualquier lugar que no sea el operando del operador unario negativo ( §15.15.4 ).