Partilhar via


Conversões de tipos de vírgula flutuante

Um valor de vírgula flutuante convertido em outro tipo de vírgula flutuante não sofre alteração no valor se o valor original for representável exatamente no tipo de resultado. Se o valor original for numérico, mas não for representável exatamente, o resultado será o próximo maior ou o próximo menor valor representável. Consulte Limites em constantes de vírgula flutuante para o intervalo de tipos de vírgula flutuante.

Um valor de vírgula flutuante que é convertido em um tipo integral é primeiro truncado descartando qualquer valor fracionário. Se esse valor truncado for representável no tipo de resultado, o resultado deverá ser esse valor. Quando não é representável, o valor do resultado é indefinido.

Específico da Microsoft

Os compiladores da Microsoft usam representação binary32 IEEE-754 para float valores e representação binary64 para long double e double. Uma vez que long double usam double a mesma representação, eles têm o mesmo alcance e precisão.

Quando o compilador converte um doublelong double número de ponto flutuante em um float, ele arredonda o resultado de acordo com os controles de ambiente de ponto flutuante, que padrão para "arredondar para mais perto, laços para par". Se um valor numérico for muito alto ou muito baixo para ser representado como um valor numérico float , o resultado da conversão será infinito positivo ou negativo de acordo com o sinal do valor original, e uma exceção de estouro será gerada, se habilitada.

O resultado de uma conversão para um tipo integral menor do que long é o resultado da conversão do valor em e, em longseguida, da conversão para o tipo de resultado.

Para conversão em tipos inteiros pelo menos tão grandes quanto long, uma conversão de um valor que é muito alto ou muito baixo para representar no tipo de resultado pode retornar qualquer um dos seguintes valores:

  • O resultado pode ser um valor sentinela, que é o valor representável mais distante de zero. Para tipos assinados, é o menor valor representável (0x800... 0). Para tipos não assinados, é o maior valor representável (0xFF... F).

  • O resultado pode estar saturado, onde valores muito altos para representar são convertidos para o valor representável mais alto. Os valores muito baixos para representar são convertidos para o menor valor representável. Um destes dois valores é também utilizado como valor sentinela.

  • Para conversão para unsigned long ou unsigned long long, o resultado da conversão de um valor fora do intervalo pode ser algum valor diferente do valor representável mais alto ou mais baixo. Se o resultado é um valor sentinela ou saturado ou não, depende das opções do compilador e da arquitetura de destino. Versões futuras do compilador podem retornar um valor saturado ou sentinela.

END Específico da Microsoft

A tabela a seguir resume as conversões de tipos flutuantes.

Tabela de conversões de tipos de vírgula flutuante

De Para Método
float char Converter em longe, em seguida, converter long em char
float short Converter em longe, em seguida, converter long em short
float int Truncar no ponto decimal. Se o resultado for muito grande para ser representado como int, o resultado será indefinido.
float long Truncar no ponto decimal. Se o resultado for muito grande para ser representado como long, o resultado será indefinido.
float long long Truncar no ponto decimal. Se o resultado for muito grande para ser representado como long long, o resultado será indefinido.
float unsigned char Converter em longe, em seguida, converter long em unsigned char
float unsigned short Converter em longe, em seguida, converter long em unsigned short
float unsigned Truncar no ponto decimal. Se o resultado for muito grande para ser representado como unsigned, o resultado será indefinido.
float unsigned long Truncar no ponto decimal. Se o resultado for muito grande para ser representado como unsigned long, o resultado será indefinido.
float unsigned long long Truncar no ponto decimal. Se o resultado for muito grande para ser representado como unsigned long long, o resultado será indefinido.
float double Representar como um doublearquivo .
float long double Representar como um long doublearquivo . Em MSVC, long double e double têm a mesma representação.
double char Converter em floate, em seguida, converter float em char
double short Converter em floate, em seguida, converter float em short
double int Truncar no ponto decimal. Se o resultado for muito grande para ser representado como int, o resultado será indefinido.
double long Truncar no ponto decimal. Se o resultado for muito grande para ser representado como long, o resultado será indefinido.
double unsigned char Converter em longe, em seguida, converter long em unsigned char
double unsigned short Converter em longe, em seguida, converter long em unsigned short
double unsigned Truncar no ponto decimal. Se o resultado for muito grande para ser representado como unsigned, o resultado será indefinido.
double unsigned long Truncar no ponto decimal. Se o resultado for muito grande para ser representado como unsigned long, o resultado será indefinido.
double unsigned long long Truncar no ponto decimal. Se o resultado for muito grande para ser representado como unsigned long long, o resultado será indefinido.
double float Representar como um floatarquivo . Se o double valor não puder ser representado exatamente como float, ocorrerá perda de precisão.
double long double O long double valor é tratado como double.

As conversões de long double seguem o mesmo método que as conversões de double.

Ver também

Conversões de atribuição