Conversiones de tipos de punto flotante
Un valor de punto flotante que se convierte a otro tipo de punto flotante no sufre ningún cambio en el valor si el valor original se puede representar exactamente en el tipo del resultado. Si el valor original es numérico, pero no se puede representar exactamente, el resultado es el siguiente valor más alto o más bajo que se puede representar. Vea Límites en constantes de punto flotante para el intervalo de tipos de punto flotante.
Un valor de punto flotante que se convierte en un tipo entero se trunca primero mediante el descarte de todo valor fraccionario. Si este valor truncado se puede representar en el tipo del resultado, el resultado debe ser ese valor. Cuando no se puede representar, el valor del resultado es indefinido.
Específicos de Microsoft
Los compiladores de Microsoft usan la representación binary32 de IEEE-754 para los valores float
y la representación binary64 para long double
y double
. Como long double
y double
usan la misma representación, tienen el mismo rango y precisión.
Cuando el compilador convierte un número de punto flotante double
o long double
en un float
, redondea el resultado según los controles de entorno de punto flotante, que tienen como valor predeterminado "redondear al más próximo, empatar en par". Si un valor numérico es demasiado alto o demasiado bajo para representarse como un valor numérico float
, el resultado de la conversión es infinito positivo o negativo según el signo del valor original y se genera una excepción de desbordamiento, si está habilitada.
El resultado de una conversión a un tipo integral menor que long
es el resultado de convertir el valor a long
y, luego, convertirlo al tipo del resultado.
Para la conversión a tipos enteros como mínimo tan grandes como long
, la conversión de un valor demasiado alto o demasiado bajo para representarlo en el tipo del resultado puede devolver cualquiera de los siguientes valores:
El resultado puede ser un valor centinela, que es el valor que se puede representar más alejado de cero. En el caso de los tipos con signo, es el valor más bajo que se puede representar (0x800...0). En el caso de los tipos sin signo, es el valor más alto que se puede representar (0xFF...F).
Puede que el resultado esté saturado; en ese caso, los valores que son demasiado elevados como para representarlos se convierten al valor representable más alto. Los valores que son demasiado bajos como para representarlos se convierten al valor representable más bajo. Uno de estos dos valores también se usa como valor centinela.
Para la conversión en
unsigned long
ounsigned long long
, el resultado de convertir un valor fuera del intervalo puede ser un valor distinto del valor más alto o más bajo que se puede representar. El hecho de que el resultado sea un valor centinela o saturado depende de las opciones del compilador y de la arquitectura de destino. Las versiones futuras del compilador podrían devolver un valor saturado o centinela.
FIN de Específicos de Microsoft
En la tabla siguiente se resumen las conversiones de tipos de punto flotante.
Tabla de conversiones de tipos de punto flotante
De | En | Método |
---|---|---|
float |
char |
Convertir a long y luego convertir long a char |
float |
short |
Convertir a long y luego convertir long a short |
float |
int |
Trunca en el separador decimal. Si el resultado es demasiado grande para representarse como int , el resultado es indefinido. |
float |
long |
Trunca en el separador decimal. Si el resultado es demasiado grande para representarse como long , el resultado es indefinido. |
float |
long long |
Trunca en el separador decimal. Si el resultado es demasiado grande para representarse como long long , el resultado es indefinido. |
float |
unsigned char |
Convertir a long y luego convertir long a unsigned char |
float |
unsigned short |
Convertir a long y luego convertir long a unsigned short |
float |
unsigned |
Trunca en el separador decimal. Si el resultado es demasiado grande para representarse como unsigned , el resultado es indefinido. |
float |
unsigned long |
Trunca en el separador decimal. Si el resultado es demasiado grande para representarse como unsigned long , el resultado es indefinido. |
float |
unsigned long long |
Trunca en el separador decimal. Si el resultado es demasiado grande para representarse como unsigned long long , el resultado es indefinido. |
float |
double |
Se representa como double . |
float |
long double |
Se representa como long double . En MSVC, long double y double tienen la misma representación. |
double |
char |
Convertir a float y luego convertir float a char |
double |
short |
Convertir a float y luego convertir float a short |
double |
int |
Trunca en el separador decimal. Si el resultado es demasiado grande para representarse como int , el resultado es indefinido. |
double |
long |
Trunca en el separador decimal. Si el resultado es demasiado grande para representarse como long , el resultado es indefinido. |
double |
unsigned char |
Convertir a long y luego convertir long a unsigned char |
double |
unsigned short |
Convertir a long y luego convertir long a unsigned short |
double |
unsigned |
Trunca en el separador decimal. Si el resultado es demasiado grande para representarse como unsigned , el resultado es indefinido. |
double |
unsigned long |
Trunca en el separador decimal. Si el resultado es demasiado grande para representarse como unsigned long , el resultado es indefinido. |
double |
unsigned long long |
Trunca en el separador decimal. Si el resultado es demasiado grande para representarse como unsigned long long , el resultado es indefinido. |
double |
float |
Se representa como float . Si el valor double no se puede representar exactamente como float , se produce una pérdida de precisión. |
double |
long double |
El valor long double se trata como double . |
Las conversiones de long double
siguen el mismo método que las conversiones de double
.