Casting un doble a otro tipo numérico
Hay algo que me desconcierta y no encontré mucha información sobre las especificaciones de la máquina virtual. Es un poco oscuro y eso sería bueno si alguien me pudiera explicar.
Estas pocas líneas de código .....
<code>double myTest = Double.MAX_VALUE; System.out.println("1. float: " + (float)myTest); System.out.println("2. int: " + (int)myTest); System.out.println("3. short: " + (short)myTest); System.out.println("4. byte: " + (byte)myTest); </code>
..... producir esta salida:
flotar: infinitoint: 2147483647corto: -1byte: -1byte
, short
yint
Son 8, 16, 32 bits con complemento a dos.float
ydouble
Son 32 y 64 bits IEEE 754 (mira aquí).
Desde mi entendimiento, el valor máximo de undouble
implica que todos los bits de la mantisse (52 bits) se cambian a 1. Por lo tanto, no es (muy) sorprendente que una conversión a corto o byte devuelva -1, es decir, todos los bits se cambien a 1. Parece que la conversión mantiene el 'cola' de ladouble
para que encaje en 8 bitsbyte
o 16 bitsshort
.
Lo que me sorprende es el elenco paraint
y, en menor medida, el elenco afloat
. ¿Cómo es posible obtener "2. int: 2147483647" que es 0x7FFFFFFF, el valor máximo mientras corto y el byte 3. y 4. son -1?
El elenco parafloat
También es raro. Si los 32 bits en la 'cola' demyTest
se mantuvieron, entonces ¿no debería generar unaNaN
?