/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 开发环境中设置此编译器选项
打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
选择“配置属性”>“C/C++”>“命令行”属性页。
修改“其他选项”属性以添加
/fpcvt:IA
或/fpcvt:BC
。 选择“确定”以保存更改 。
以编程方式设置此编译器选项
- 请参阅 AdditionalOptions。