浮点转换

用于在实际浮点类型 (二进制到二进制,十进制到十进制,十进制到二进制) 之间转换的标准规则如下所示:

如果要转换的值可以在新类型中精确表示,那么该值保持不变。 如果要转换的值在可以表示但不能精确表示的值范围内,那么将根据有效的当前编译时或运行时舍入方式对结果进行舍入。 如果要转换的值超出可表示的值范围,那么结果取决于舍入方式。

整数到浮点 (二进制或十进制)
如果要转换的值可以在新类型中精确表示,那么该值保持不变。 如果要转换的值在可以表示但不能精确表示的值范围内,那么结果将进行正确舍入。 如果要转换的值超出可表示的值范围,那么结果为静默 NaN。
浮点 (二进制或十进制) 到整数
将废弃小数部分 (即,值被截断为零)。 如果整数部分的值不能由整数类型表示,那么结果为下列其中一项:
  • 如果整数类型为无符号,那么如果浮点数为正数,那么结果为最大可表示数字,否则为 0。
  • 如果整数类型是有符号的,那么根据浮点数的符号,结果是最负数或正数的可表示数。

十进制浮点类型的隐式转换 (IBM 扩展)

编译器具有以下十进制浮点类型:
  • _Decimal32
  • _Decimal64
  • _Decimal128
始终支持以下隐式转换:
  • 十进制浮点类型之间的隐式转换:
    • _Decimal32 to _Decimal64
    • _Decimal32 to _Decimal128
    • _Decimal64 to _Decimal32
    • _Decimal64 to _Decimal128
    • _Decimal128 to _Decimal32
    • _Decimal128 to _Decimal64
  • 十进制浮点类型与以下整数类型之间的隐式转换:
    • signed char, unsigned char
    • signed short int, unsigned short int
    • signed int, unsigned int
    • signed long int, unsigned long int
    • signed long long int, unsigned long long int
  • 十进制浮点类型与布尔类型 bool_Bool之间的隐式转换。
有条件地支持十进制浮点类型与以下通用浮点类型之间的隐式转换。 它通过使用简单赋值运算符 = ,初始化,函数自变量传递和函数返回语句的赋值操作受支持。
  • float
  • double
  • long double
以下示例演示了从通用浮点类型到十进制浮点类型的隐式转换。 在此示例中,变量 f1 在初始化中从类型 float 隐式转换为类型 _Decimal32
float f1;
_Decimal32 d1 = f1;
仅限 C + + 开始
float f1;
_Decimal32 d1(f1);
仅限 C++ 结束
限制: 除非使用显式转换,否则不能将十进制浮点类型与算术表达式中的通用浮点类型或复杂浮点类型混合。 这里有个示例:
_Decimal32 d1;
float f1;
float f2 = f1 + d1;         // Incorrect
float f3 = f1 + (float)d1;  // Correct

复杂转换

复杂到复杂
如果类型相同,那么没有任何更改。 如果类型的大小不同,并且值可以由新类型表示,那么不会更改值; 如果值不能由新类型表示,那么将根据上面给出的标准转换规则来转换实部和虚部。
复杂到实际 (二进制)
将废弃复杂值的虚部分。 必要时,根据上面给出的标准转换规则对真实部分的值进行转换。
从复杂到实际 (十进制)
将废弃复杂值的虚部分。 根据上面给出的标准转换规则,实部的值由二进制转换为十进制浮点。
(二进制) 到复杂
源值用作复杂值的实际部分,必要时根据上面给出的标准转换规则进行转换。 假想部分的值为零。
实际 (十进制) 到复杂
根据上面给出的标准转换规则,将源值从 decimal 转换为 binary 浮点,并用作复杂值的实际部分。 假想部分的值为零。