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