Partager via


Conversions depuis les types à virgule flottante

Une valeur à virgule flottante convertie en un autre type à virgule flottante ne subit aucune modification de valeur si la valeur d’origine n’est pas représentable exactement dans le type de résultat. Si la valeur d’origine est numérique, mais n’est pas représentable exactement, le résultat est la valeur supérieure ou plus inférieure suivante. Consultez Limites des constantes à virgule flottante pour la plage de types à virgule flottante.

Une valeur à virgule flottante convertie en type intégral est d’abord tronquée en ignorant toute valeur fractionnaire. Si cette valeur tronquée n’est pas représentable dans le type de résultat, le résultat doit être cette valeur. Lorsqu’elle n’est pas représentable, la valeur de résultat n’est pas définie.

Section spécifique à Microsoft

Les compilateurs Microsoft utilisent la représentation IEEE-754 binary32 pour les valeurs float et la représentation binary64 pour long double et double. Étant donné que long double et double utilisent la même représentation, ils ont la même plage et la même précision.

Lorsque le compilateur convertit un nombre à virgule flottante double ou long double en float, il arrondit le résultat en fonction des contrôles d’environnement à virgule flottante qui sont par défaut arrondis au plus proche, égalisés au pair. Si une valeur numérique est trop haute ou trop basse pour être représentée comme une valeur numérique float, le résultat de la conversion est l’infini positif ou négatif en fonction du signe de la valeur d’origine, et une exception de dépassement est levée, si elle est activée.

Le résultat d’une conversion en type intégral plus petit que long est le résultat de la conversion de la valeur en long, puis de la conversion en type de résultat.

Pour la conversion en types entiers au moins aussi grands que long, une conversion d’une valeur trop haute ou trop basse pour être représentée dans le type de résultat peut retourner l’une des valeurs suivantes :

  • Le résultat peut être une valeur sentinelle, qui est la valeur représentable la plus éloignée de zéro. Pour les types signés, il s’agit de la valeur représentable la plus basse (0x800... 0). Pour les types non signés, il s’agit de la valeur représentable la plus haute (0xFF... F).

  • Le résultat peut être saturé, où les valeurs trop hautes pour être représentées sont converties en valeur la plus haute représentable. Les valeurs trop basses pour être représentées sont converties en valeur la plus basse représentable. L’une de ces deux valeurs est également utilisée comme valeur sentinelle.

  • Pour la conversion vers unsigned long ou unsigned long long, le résultat de la conversion d’une valeur hors plage peut être une valeur autre que la valeur la plus haute ou la plus basse représentable. Que le résultat soit ou non une valeur sentinelle ou saturée dépend des options du compilateur et de l’architecture cible. Les versions futures du compilateur peuvent retourner une valeur saturée ou sentinelle à la place.

FIN de la section spécifique à Microsoft

Le tableau suivant répertorie les conversions des types de flottant.

Table de conversions à partir de types à virgule flottante

Du À Méthode
float char Convertir en long, puis convertir long en char
float short Convertir en long, puis convertir long en short
float int Tronquer à la virgule décimale. Si le résultat est trop grand pour être représenté comme int, il est indéfini.
float long Tronquer à la virgule décimale. Si le résultat est trop grand pour être représenté comme long, il est indéfini.
float long long Tronquer à la virgule décimale. Si le résultat est trop grand pour être représenté comme long long, il est indéfini.
float unsigned char Convertir en long, puis convertir long en unsigned char
float unsigned short Convertir en long, puis convertir long en unsigned short
float unsigned Tronquer à la virgule décimale. Si le résultat est trop grand pour être représenté comme unsigned, il est indéfini.
float unsigned long Tronquer à la virgule décimale. Si le résultat est trop grand pour être représenté comme unsigned long, il est indéfini.
float unsigned long long Tronquer à la virgule décimale. Si le résultat est trop grand pour être représenté comme unsigned long long, il est indéfini.
float double Représenter comme double.
float long double Représenter comme long double. Dans MSVC, long double et double ont la même représentation.
double char Convertir en float, puis convertir float en char
double short Convertir en float, puis convertir float en short
double int Tronquer à la virgule décimale. Si le résultat est trop grand pour être représenté comme int, il est indéfini.
double long Tronquer à la virgule décimale. Si le résultat est trop grand pour être représenté comme long, il est indéfini.
double unsigned char Convertir en long, puis convertir long en unsigned char
double unsigned short Convertir en long, puis convertir long en unsigned short
double unsigned Tronquer à la virgule décimale. Si le résultat est trop grand pour être représenté comme unsigned, il est indéfini.
double unsigned long Tronquer à la virgule décimale. Si le résultat est trop grand pour être représenté comme unsigned long, il est indéfini.
double unsigned long long Tronquer à la virgule décimale. Si le résultat est trop grand pour être représenté comme unsigned long long, il est indéfini.
double float Représenter comme float. Si la valeur double ne peut pas être représentée exactement comme float, une perte de précision se produit.
double long double La valeur long double est traitée comme double.

Les conversions à partir de long double suivent la même méthode que les conversions à partir de double.

Voir aussi

Conversions d’affectation