Преобразования типов с плавающей запятой
Если значение с плавающей запятой преобразуется в другой тип с плавающей запятой и при этом может быть точно представлено в результирующем типе, оно не изменяется. Если исходное значение является числовым, но при этом не может быть представлено точно, результатом будет следующее более высокое или низкое значение, которое может быть представлено. Диапазон типов с плавающей запятой см. в разделе Ограничения констант с плавающей запятой.
При преобразовании значения с плавающей запятой в целочисленный тип оно сначала усекается путем удаления дробной части. Если усеченное значение может быть представлено в результирующем типе, результатом должно быть это значение. Если значение не может быть представлено, результат не определен.
Блок, относящийся только к системам Майкрософт
Компиляторы Майкрософт используют представление binary32 согласно IEEE-754 для значений типа float
и представление binary64 для long double
и double
. Так как для long double
и double
используется одно и то же представление, они имеют одинаковый диапазон и точность.
Когда компилятор преобразует число типа double
или long double
с плавающей запятой в значение float
, он округляет результат в соответствии с элементами управления среды с плавающей запятой, значение по умолчанию которых — "округлить до ближайшего числа с привязкой к четному". Если числовое значение слишком велико или слишком мало для представления в виде числового значения float
, результат преобразования будет положительной или отрицательной бесконечностью в соответствии со знаком исходного значения, и возникает исключение переполнения, если оно включено.
Для преобразования в целочисленный тип меньше long
сначала значение преобразуется в тип long
, а затем в результирующий тип.
При преобразовании в целочисленные типы не меньше long
для значения, которое слишком велико или слишком мало для представления в результирующем типе, может возвращаться любое из следующих значений:
Результатом может быть значение-метка, то есть представимое значение, максимально удаленное от нуля. Для типов со знаком это наименьшее представимое значение (0x800...0). Для типов без знака это наибольшее представимое значение (0xFF...F).
Результат может дополняться, то есть значение, которое слишком велико для представления, преобразуется в наибольшее представимое значение, а значение, которое слишком мало для представления, преобразуется в наименьшее представимое значение. Одно из этих двух значений также используется в качестве значения-метки.
При преобразовании в тип
unsigned long
илиunsigned long long
значения, выходящего за пределы соответствующего диапазона, результатом может быть некоторое значение, отличающееся от наибольшего или наименьшего представимого. Будет ли результат значением-меткой, дополненным значением или ни тем ни другим, зависит от параметров компилятора и целевой архитектуры. В будущих версиях компилятора может возвращаться дополненное значение или значение-метка, даже если в предыдущих версиях оно не возвращалось.
Завершение блока, относящегося только к системам Майкрософт
В следующей таблице перечислены преобразования из типов с плавающей запятой.
Таблица преобразования типов с плавающей запятой
С дт. | По | Способ |
---|---|---|
float |
char |
Преобразование в long , затем преобразование long в char |
float |
short |
Преобразование в long , затем преобразование long в short |
float |
int |
Усечение до десятичной запятой. Если результат слишком велик для представления в качестве значения int , результат не определен. |
float |
long |
Усечение до десятичной запятой. Если результат слишком велик для представления в качестве значения long , результат не определен. |
float |
long long |
Усечение до десятичной запятой. Если результат слишком велик для представления в качестве значения long long , результат не определен. |
float |
unsigned char |
Преобразование в long , затем преобразование long в unsigned char |
float |
unsigned short |
Преобразование в long , затем преобразование long в unsigned short |
float |
unsigned |
Усечение до десятичной запятой. Если результат слишком велик для представления в качестве значения unsigned , результат не определен. |
float |
unsigned long |
Усечение до десятичной запятой. Если результат слишком велик для представления в качестве значения unsigned long , результат не определен. |
float |
unsigned long long |
Усечение до десятичной запятой. Если результат слишком велик для представления в качестве значения unsigned long long , результат не определен. |
float |
double |
Представление в качестве значения double . |
float |
long double |
Представление в качестве значения long double . В MSVC long double и double имеют одно и то же представление. |
double |
char |
Преобразование в float , затем преобразование float в char |
double |
short |
Преобразование в float , затем преобразование float в short |
double |
int |
Усечение до десятичной запятой. Если результат слишком велик для представления в качестве значения int , результат не определен. |
double |
long |
Усечение до десятичной запятой. Если результат слишком велик для представления в качестве значения long , результат не определен. |
double |
unsigned char |
Преобразование в long , затем преобразование long в unsigned char |
double |
unsigned short |
Преобразование в long , затем преобразование long в unsigned short |
double |
unsigned |
Усечение до десятичной запятой. Если результат слишком велик для представления в качестве значения unsigned , результат не определен. |
double |
unsigned long |
Усечение до десятичной запятой. Если результат слишком велик для представления в качестве значения unsigned long , результат не определен. |
double |
unsigned long long |
Усечение до десятичной запятой. Если результат слишком велик для представления в качестве значения unsigned long long , результат не определен. |
double |
float |
Представление в качестве значения float . Если значение double невозможно точно представить с типом float , происходит потеря точности. |
double |
long double |
Значение long double рассматривается как double . |
Преобразования из типа long double
производятся так же, как из типа double
.