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: -1

byte, 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 ?

Respuestas a la pregunta(1)

Su respuesta a la pregunta