c'è qualcosa che mi lascia perplesso e non ho trovato molte informazioni sulle specifiche VM. È un po 'oscuro e sarebbe bello se qualcuno potesse spiegarmi.Trasmettere un doppio ad un altro tipo numerico
Queste poche linee di codice .....
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);
..... produrre questo output:
- float: infinità
- int: 2147483647
- breve: -1
- byte: -1
byte
, short
e int
sono 8, 16, 32 bit con complemento a due. float
e double
sono 32 e 64 bit IEEE 754 (see here).
Dal mio punto di vista, il valore massimo di un double
implica che tutti i bit del mantisse (52 bit) vengono commutati su 1. Pertanto non è (molto) sorprendente che un cast per i ritorni a byte brevi o byte -1 vale a dire tutti i bit sono passati a 1. Sembra che il cast mantenga la "coda" del double
in modo che si adatti a 8 bit byte
oa 16 bit short
.
Ciò che mi sorprende è il cast a int
e, in misura minore, il cast a float
. Come è possibile ottenere "2. int: 2147483647" che è 0x7FFFFFFF, il valore massimo mentre short e byte 3. e 4. sono -1?
Il cast a float
è anche strano. Se i 32 bit della "coda" di myTest
sono stati mantenuti, non dovrebbe generare un valore NaN
?
Grazie, è molto interessante. Quindi, una volta che il double è stato castato su un int ("con il più grande valore rappresentabile" nel mio esempio), viene castato su un byte o su un corto con una filosofia diversa ("scarta tutti tranne i bit di ordine inferiore"). – Jerome
@Jerome: praticamente (a parte il fatto che il tipo intermedio è "lungo", ma non influisce sul risultato). – NPE
Vale la pena notare che sebbene lanciare 'double' su' float' può far sì che alcuni valori distinti diventino indistinguibili, questo è un problema minore rispetto al fatto che lanciare 'float' in' double' può causare cose che dovrebbero essere considerate indistinguibili essere classificato * erroneamente *. Ad esempio, dato 'float f = 16777217; double d = 16777216.0000001; ', che è più grande - 'f' o' d'? Che ne dite di 'float ff = 1E38f * 10f; double dd = 1e300; '? Considerare 'ff' e' dd' come "indistinguibili" non sarebbe grandioso, ma dire 'ff> dd 'è sbagliato in centinaia di ordini di grandezza. – supercat