Supongamos que si i tiene una variable con algunos valores aleatorios más grandes de tipo dobles:
double d = 4786777867867868654674678346734763478673478654478967.77;
Ahora si trato de convertir esto en flotador en algún momento de mi programa, la salida da 'infinito' (en Eclipse IDE):
float f = (float)d; // inifinty
byte b = (byte)d; // some valid value
short s = (short)d; // some valid value
int i = (int)d; // some valid value
Alguien me puede dar alguna respuesta válidos, cómo no es la conversión de tipo de datos sólo para la flotación?
Vamos a echar un vistazo al resultado de lanzar este gran double
a cada uno de los otros tipos primitivos numéricos:
double d = 4786777867867868654674678346734763478673478654478967.77;
System.out.printf("float %f\n", (float)d);
System.out.printf("long %d\n", (long)d);
System.out.printf("int %d\n", (int)d);
System.out.printf("short %d\n", (short)d);
System.out.printf("byte %d\n", (byte)d);
Salida:
float Infinity
long 9223372036854775807
int 2147483647
short -1
byte -1
Flotador
A partir de los JLS :
Una conversión primitiva estrechamiento de doble a flotador se rige por las reglas de redondeo IEEE 754 (§4.2.4). Esta conversión puede perder precisión, sino también gama perder, lo que resulta en un flotador cero desde un distinto de cero doble y una infinidad de flotación de una doble finita .
Básicamente, IEEE 754 mandatos este comportamiento. IEEE 754 reserva un patrón de bits específica para representar el infinito, y todas las operaciones de punto flotante que implican este valor se definen.
Long & Int
Los estados JLS que en el caso de una conversión primitiva estrechamiento de double
a long
o int
, donde el valor es demasiado grande para caber en el intervalo (64 o 32 bits entero con signo), el mayor valor representable debe ser utilizado, Long.MAX_VALUE
y Integer.MAX_VALUE
;
Corto y Byte
En echando una double
a una short
o byte
, el número es primero fundido a una int
, utilizando la regla anterior. Se echó a continuación, a partir de int
a short
o byte
descartando todos, pero los n
bits más bajos (16 a short
, 8 para byte
). Desde todos, pero el bit alto de Integer.MAX_VALUE
se establece en 1, la short
y byte
los valores se han fijado todos los bits, que corresponde a -1 en firmado complemento a dos.