Conversions from floating-point types
A floating-point value that’s converted to another floating-point type undergoes no change in value if the original value is representable exactly in the result type. If the original value is numeric but isn’t representable exactly, the result is either the next greater or next lower representable value. See Limits on floating-point constants for the range of floating-point types.
A floating-point value that is converted to an integral type is first truncated by discarding any fractional value. If this truncated value is representable in the result type, the result must be that value. When it isn’t representable, the result value is undefined.
Microsoft Specific
Microsoft compilers use IEEE-754 binary32 representation for float values, and binary64 representation for long double and double . Since long double and double use the same representation, they have the same range and precision.
When the compiler converts a double or long double floating-point number to a float , it rounds the result according to the floating-point environment controls, which default to «round to nearest, ties to even.» If a numeric value is too high or too low to be represented as a numeric float value, the conversion result is positive or negative infinity according to the sign of the original value, and an overflow exception is raised, if enabled.
The result of a conversion to an integral type smaller than long is the result of converting the value to long , and then converting to the result type.
For conversion to integer types at least as large as long , a conversion of a value that is too high or too low to represent in the result type may return any of the following values:
- The result may be a sentinel value, which is the representable value farthest from zero. For signed types, it’s the lowest representable value (0x800. 0). For unsigned types, it’s the highest representable value (0xFF. F).
- The result may be saturated, where values too high to represent are converted to the highest representable value. Values too low to represent are converted to the lowest representable value. One of these two values is also used as the sentinel value.
- For conversion to unsigned long or unsigned long long , the result of converting an out-of-range value may be some value other than the highest or lowest representable value. Whether the result is a sentinel or saturated value or not depends on the compiler options and target architecture. Future compiler releases may return a saturated or sentinel value instead.
END Microsoft Specific
The following table summarizes conversions from floating types.
Table of conversions from floating-point types
From | To | Method |
---|---|---|
float | char | Convert to long , then convert long to char |
float | short | Convert to long , then convert long to short |
float | int | Truncate at decimal point. If result is too large to be represented as int , result is undefined. |
float | long | Truncate at decimal point. If result is too large to be represented as long , result is undefined. |
float | long long | Truncate at decimal point. If result is too large to be represented as long long , result is undefined. |
float | unsigned char | Convert to long , then convert long to unsigned char |
float | unsigned short | Convert to long , then convert long to unsigned short |
float | unsigned | Truncate at decimal point. If result is too large to be represented as unsigned , result is undefined. |
float | unsigned long | Truncate at decimal point. If result is too large to be represented as unsigned long , result is undefined. |
float | unsigned long long | Truncate at decimal point. If result is too large to be represented as unsigned long long , result is undefined. |
float | double | Represent as a double . |
float | long double | Represent as a long double . In MSVC, long double and double have the same representation. |
double | char | Convert to float , then convert float to char |
double | short | Convert to float , then convert float to short |
double | int | Truncate at decimal point. If result is too large to be represented as int , result is undefined. |
double | long | Truncate at decimal point. If result is too large to be represented as long , result is undefined. |
double | unsigned char | Convert to long , then convert long to unsigned char |
double | unsigned short | Convert to long , then convert long to unsigned short |
double | unsigned | Truncate at decimal point. If result is too large to be represented as unsigned , result is undefined. |
double | unsigned long | Truncate at decimal point. If result is too large to be represented as unsigned long , result is undefined. |
double | unsigned long long | Truncate at decimal point. If result is too large to be represented as unsigned long long , result is undefined. |
double | float | Represent as a float . If the double value can’t be represented exactly as float , loss of precision occurs. |
double | long double | The long double value is treated as double . |
Conversions from long double follow the same method as conversions from double .
Преобразования типов с плавающей запятой
Если значение с плавающей запятой преобразуется в другой тип с плавающей запятой и при этом может быть точно представлено в результирующем типе, оно не изменяется. Если исходное значение является числовым, но при этом не может быть представлено точно, результатом будет следующее более высокое или низкое значение, которое может быть представлено. Диапазон типов с плавающей запятой см. в разделе Ограничения констант с плавающей запятой.
При преобразовании значения с плавающей запятой в целочисленный тип оно сначала усекается путем удаления дробной части. Если усеченное значение может быть представлено в результирующем типе, результатом должно быть это значение. Если значение не может быть представлено, результат не определен.
Блок, относящийся только к системам Microsoft
Компиляторы Майкрософт используют представление 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 .