Compartir a través de


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 o unsigned 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 .

Vea también

Conversiones de asignación