Condividi tramite


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 floatoggetto , 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 longe 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 o unsigned 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.

Vedi anche

Conversioni di assegnazione