ejemplos - Java-Conversión explícita de Int a corto
short en java (3)
Con su valor de 100 millones, obtengo -7936. Solo puedo obtener 16960 si cambio 100 millones a 1 millón.
La razón es que short
valores short
están limitados a -32768 a +32767, y Java solo conserva los 16 bits menos significativos cuando se convierte en un short
(una conversión de primitiva de estrechamiento, JLS 5.1.3 ). Efectivamente esta operación: 1 millón de mod 2 ^ 16 (16 bits en un short
) es 16960.
¿Puede alguien explicar por qué esta declaración siguiente?
short value = (short) 100000000;
System.out.println(value);
Me da:
16960
Sabiendo que el valor máximo de un corto en Java es 32767 correcto?
La forma en que lo hizo meramente reinterpreta un número menor de bits en la misma ubicación de memoria. No los cambia.
Probablemente desee utilizar las funciones max
Y min
. Para detectar cuándo el valor se encuentra más allá de short
y asignar el valor máximo o mínimo del corto cuando eso ocurra.
int n = 1000000;
short value = n > Short.MAX_VALUE ? Short.MAX_VALUE : n < Short.MIN_VALUE ? Short.MIN_VALUE : (short)n;
Actualización: más compacto:
import static java.lang.Math.max;
import static java.lang.Math.min;
// ...
value = (short)min(max(value, Short.MIN_VALUE), Short.MAX_VALUE);
System.out.println(value);
Aquí hay un buen artículo que explica el estrechamiento y la ampliación de las conversiones primitivas en Java.
short s = 696; // 0000 0010 1011 1000 byte x = (byte)s; System.out.println("byte x = " + x);
Produce:
byte x = -72
Ahora debe entender por qué, porque cuando nos acercamos al byte, la JVM descarta la parte más importante (00000010) y el resultado (en forma binaria) es 10111000. Este es el mismo número que estábamos viendo antes. Y, como pueden ver, es negativo, a diferencia del valor original.