Conversioni dai tipi a virgola mobile
Un valore a virgola mobile convertito in un altro tipo a virgola mobile non subisce alcuna modifica nel valore se il valore originale è rappresentabile esattamente nel tipo di risultato. Se il valore originale è numerico ma non è rappresentabile esattamente, il risultato sarà il successivo valore rappresentabile maggiore o successivo inferiore. Vedere Limiti sulle costanti a virgola mobile per l'intervallo di tipi a virgola mobile.
Un valore a virgola mobile convertito in un tipo integrale viene prima troncato rimuovendo qualsiasi valore frazionaria. Se questo valore troncato è rappresentabile nel tipo di risultato, il risultato deve essere tale valore. Quando non è rappresentabile, il valore del risultato non è definito.
Sezione specifica Microsoft
I compilatori Microsoft usano la rappresentazione binary32 IEEE-754 per float
i valori e la rappresentazione binary64 per long double
e double
. Poiché long double
e double
usano la stessa rappresentazione, hanno lo stesso intervallo e la stessa precisione.
Quando il compilatore converte un double
numero a virgola mobile o long double
in un float
oggetto , arrotonda il risultato in base ai controlli dell'ambiente a virgola mobile, che per impostazione predefinita "arrotondare al più vicino, lega addirittura". Se un valore numerico è troppo alto o troppo basso da rappresentare come valore numerico float
, il risultato della conversione è un infinito positivo o negativo in base al segno del valore originale e viene generata un'eccezione di overflow, se abilitata.
Il risultato di una conversione in un tipo integrale più piccolo di long
è il risultato della conversione del valore in long
e quindi della conversione nel tipo di risultato.
Per la conversione in tipi integer almeno di grandi dimensioni long
, una conversione di un valore troppo alto o troppo basso per rappresentare nel tipo di risultato può restituire uno dei valori seguenti:
Il risultato può essere un valore sentinel, ovvero il valore rappresentabile più lontano da zero. Per i tipi firmati, è il valore rappresentabile più basso (0x800... 0). Per i tipi senza segno, è il valore rappresentabile più alto (0xFF... F).
Il risultato può essere saturo, dove i valori troppo alti da rappresentare vengono convertiti nel valore rappresentabile più alto. I valori troppo bassi per rappresentare vengono convertiti nel valore rappresentabile più basso. Uno di questi due valori viene usato anche come valore sentinel.
Per la conversione in
unsigned long
ounsigned long long
, il risultato della conversione di un valore out-of-range può essere un valore diverso dal valore rappresentabile più alto o più basso. Se il risultato è un valore sentinel o saturo o non dipende dalle opzioni del compilatore e dall'architettura di destinazione. Le versioni future del compilatore possono invece restituire un valore saturo o sentinel.
Fine sezione specifica Microsoft
Nella tabella seguente sono riepilogate le conversioni dai tipi a virgola mobile.
Tabella delle conversioni da tipi a virgola mobile
Da | Per | metodo |
---|---|---|
float |
char |
Converti in long , quindi converti long in char |
float |
short |
Converti in long , quindi converti long in short |
float |
int |
Troncare in corrispondenza del separatore decimale. Se il risultato è troppo grande da rappresentare come int , il risultato non è definito. |
float |
long |
Troncare in corrispondenza del separatore decimale. Se il risultato è troppo grande da rappresentare come long , il risultato non è definito. |
float |
long long |
Troncare in corrispondenza del separatore decimale. Se il risultato è troppo grande da rappresentare come long long , il risultato non è definito. |
float |
unsigned char |
Converti in long , quindi converti long in unsigned char |
float |
unsigned short |
Converti in long , quindi converti long in unsigned short |
float |
unsigned |
Troncare in corrispondenza del separatore decimale. Se il risultato è troppo grande da rappresentare come unsigned , il risultato non è definito. |
float |
unsigned long |
Troncare in corrispondenza del separatore decimale. Se il risultato è troppo grande da rappresentare come unsigned long , il risultato non è definito. |
float |
unsigned long long |
Troncare in corrispondenza del separatore decimale. Se il risultato è troppo grande da rappresentare come unsigned long long , il risultato non è definito. |
float |
double |
Rappresenta come .double |
float |
long double |
Rappresenta come .long double In MSVC long double e double hanno la stessa rappresentazione. |
double |
char |
Converti in float , quindi converti float in char |
double |
short |
Converti in float , quindi converti float in short |
double |
int |
Troncare in corrispondenza del separatore decimale. Se il risultato è troppo grande da rappresentare come int , il risultato non è definito. |
double |
long |
Troncare in corrispondenza del separatore decimale. Se il risultato è troppo grande da rappresentare come long , il risultato non è definito. |
double |
unsigned char |
Converti in long , quindi converti long in unsigned char |
double |
unsigned short |
Converti in long , quindi converti long in unsigned short |
double |
unsigned |
Troncare in corrispondenza del separatore decimale. Se il risultato è troppo grande da rappresentare come unsigned , il risultato non è definito. |
double |
unsigned long |
Troncare in corrispondenza del separatore decimale. Se il risultato è troppo grande da rappresentare come unsigned long , il risultato non è definito. |
double |
unsigned long long |
Troncare in corrispondenza del separatore decimale. Se il risultato è troppo grande da rappresentare come unsigned long long , il risultato non è definito. |
double |
float |
Rappresenta come .float Se il double valore non può essere rappresentato esattamente come float , si verifica una perdita di precisione. |
double |
long double |
Il long double valore viene considerato come double . |
Le conversioni da long double
seguono lo stesso metodo delle conversioni da double
.