/fpcvt(浮点到整数的转换兼容性)

指定编译器如何处理浮点到整数类型的转换。

语法

/fpcvt:IA
/fpcvt:BC

参数

/fpcvt:IA

/fpcvt:IA 选项告知编译器将浮点值转换为整数,使结果与 Intel AVX-512 转换指令兼容。 对于 x86 目标,此行为在 Visual Studio 2019 中是常见行为。

/fpcvt:BC

/fpcvt:BC 选项告知编译器将浮点值转换为无符号整数,使结果与 Visual Studio 2017 及更低版本的编译器兼容。 此行为是 Visual Studio 2022 中的默认设置。

注解

在 Visual Studio 2019 版本 16.8 及更高版本中,/fpcvt 编译器选项可用于控制浮点到整数转换的结果。 /fpcvt:BC 选项指定 Visual Studio 2022 的默认行为,这与 Visual Studio 2017 及更低版本的行为相同。 /fpcvt:IA 选项指定的行为与 Intel 体系结构 (IA) AVX-512 转换指令行为兼容。 此选项可与 32 位 x86 或 64 位 x64 目标配合使用,无论是否指定 /arch:AVX512,它都会进行应用。

对于 Visual Studio 2019,除非指定 /arch:AVX512,否则 x64 目标的默认行为与 /fpcvt:BC 一致。 通常情况下,x86 目标的行为与 /fpcvt:IA 保持一致,除非使用了 /arch:IA32/arch:SSE,或者已将函数调用的结果直接转换为无符号整数。 使用 /fpcvt 会替代默认值,因此会在任一目标上一致地处理所有转换。 ARM 和 ARM64 目标的转换行为与 /fpcvt:BC/fpcvt:IA 不一致。

标准 C++ 明确指出,如果截断的浮点值可以在整数类型中确切地进行表示,则它必须在转换为该类型时具有该值。 否则会允许任何行为。 两个 /fpcvt 选项都符合标准 C++ 的要求。 唯一的区别在于为无效源值返回的值。

/fpcvt:IA 选项会导致任何无效的转换都返回单个 sentinel 值,这是离零最远的目标值。 转换为有符号类型时,sentinel 是该类型的最小值。 无符号类型使用最大值。 浮点操作可能会返回非数 (NaN) 值来指示无效操作。 该指示器不是适合转换为整数类型的选项,整数类型没有 NaN 值。 sentinel 用作 NaN 值的代理,尽管它也可以是有效转换的结果。

当源无效时,/fpcvt:BC 选项还会使转换为有符号类型的操作返回可能的最小值。 但是,转换为无符号整数类型的操作基于转换为 long long 的操作。 为了将值转换为 unsigned int,编译器首先会将其转换为类型 long long。 然后,编译器将结果截断为 32 位。 如果要将值转换为 unsigned long long,则会将那些对 long long 来说过高的有效源值作为特殊情况处理。 所有其他值首先转换为 long long,然后重新强制转换为 unsigned long long

/fpcvt 选项是 Visual Studio 2019 版本 16.8 中的新增选项。 如果在命令行中指定多个 /fpcvt 选项,则最后一个选项优先,且编译器会生成警告。

用于转换的内部函数

可以独立于全局适用的 /fpcvt 选项指定特定转换的行为。 编译器提供内部 sentinel 转换函数来进行与 /fpcvt:IA 兼容的转换。 有关详细信息,请参阅 Sentinel 转换函数。 编译器还提供与 ARM 或 ARM64 目标体系结构上的转换兼容的饱和度转换函数。 有关详细信息,请参阅饱和度转换函数

编译器还支持内部转换函数,这些函数可以尽快执行以进行有效转换。 这些函数可能会生成任何值或引发无效转换异常。 结果取决于目标平台、编译器选项和上下文。 它们用于处理已进行范围检查的值,或者处理以某种无法导致无效转换的方式生成的值。 有关详细信息,请参阅快速转换函数

在 Visual Studio 开发环境中设置此编译器选项

  1. 打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性

  2. 选择“配置属性”>“C/C++”>“命令行”属性页

  3. 修改“其他选项”属性以添加 /fpcvt:IA/fpcvt:BC 选择“确定”以保存更改 。

以编程方式设置此编译器选项

另请参阅

MSVC 编译器选项
MSVC 编译器命令行语法
快速转换函数
饱和度转换函数
Sentinel 转换函数