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
ouunsigned 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
.