Partilhar via


Conversões de tipos de ponto flutuante

Um valor de ponto flutuante convertido em outro tipo de ponto flutuante não sofrerá nenhuma 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 valor representável maior ou inferior. Consulte Limites em constantes de ponto flutuante para ver o intervalo de tipos de ponto flutuante.

Um valor de ponto flutuante convertido em um tipo integral é truncado pela primeira vez ao descartar 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.

Seção específica da Microsoft

Os compiladores da Microsoft usam a representação binária32 do IEEE-754 para valores float e a representação binária64 para long double e double. Já que long double e double usam a mesma representação, eles têm o mesmo intervalo e precisão.

Quando o compilador converte um número de ponto flutuante double ou long double um float, ele arredonda o resultado de acordo com os controles de ambiente de ponto flutuante, cujo padrão é "arredondar para o valor mais próximos, arredondar para número 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á um 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 em um tipo integral menor que long é o resultado da conversão do valor long e, em seguida, a 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 alto ou baixo demais para ser representado 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 com sinal, é o menor valor representável (0x800... 0). Para tipos sem sinal, é o maior valor representável (0xFF... F).

  • O resultado pode estar saturado, em que valores altos demais para serem representados são convertidos no valor mais alto representável. Valores baixos demais para serem representados são convertidos no menor valor representável. Um desses dois valores também é usado como o valor sentinela.

  • Para conversão em unsigned long ou unsigned long long, o resultado da conversão de um valor fora do intervalo pode ser algum valor diferente do maior ou menor valor representável. 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.

Fim da seção específica da Microsoft

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

Tabela de conversões de tipos de ponto flutuante

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

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

Confira também

Conversões de atribuição