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