Casting double para outro tipo numérico

há algo que me intriga e não encontrei muita informação sobre as especificações da VM. É um pouco obscuro e seria bom se alguém pudesse me explicar.

Estas poucas linhas 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>

..... produzir esta saída:

float: Infinityint: 2147483647curto: -1byte: -1

byte, short eint são 8, 16, 32 bits com complemento de dois.float edouble são 32 e 64 bit IEEE 754 (Veja aqui).

Pelo que entendi, o valor máximo de umdouble implica que todos os bits do mantisse (52 bits) são comutados para 1. Portanto, não é (muito) surpreendente que um elenco para curto ou byte retorne -1, ou seja, todos os bits são comutados para 1. Parece que o elenco mantém o 'cauda' dodouble de modo que ele se encaixa em 8 bitsbyte ou 16 bitsshort.

O que me surpreende é o elenco paraint e, em menor grau, o elenco parafloat. Como é possível obter "2. int: 2147483647", que é 0x7FFFFFFF, o valor máximo enquanto curto e byte 3. e 4. são -1?

O elenco parafloat também é estranho. Se os 32 bits na 'cauda' demyTest foram mantidos, então não deve gerar umNaN ?

questionAnswers(1)

yourAnswerToTheQuestion