MSVC 是否有溢出检查数学函数?

Are there overflow check math functions for MSVC?

在寻找对有符号和无符号整数算术进行溢出检查的函数时,我遇到了 this answer,它提供了很好的编译器内部函数来在 GCC 中进行检查数学。由于我目前正在编写的代码需要跨平台,因此我也需要类似的 MSVC (Microsoft Visual Studio) 编译器。

是否存在,或者我必须手动实施吗?

对于无符号加减法,MSVC有_addcarry_u16/32/64_subborrow_u16/32/64,都在<intrin.h>中定义。他们似乎产生了最佳代码,包括生成 addsub 而不是 adcsbb 如果你为进位传递常量 0.

不幸的是,没有类似的内在函数 return 溢出标志。

对于64×64乘法,__mulh and __umulh return结果的高64位,你可以在无符号的情况下与0或在有符号的情况下与low >> 63进行比较。还有 _[u]mul128 函数 return 整个结果,但我认为它们使用起来会更麻烦,并且会生成相同的优化代码(我还没有测试过)。

除法有_[u]div64 and _[u]div128,定义在<immintrin.h>。似乎没有记录他们在溢出的情况下所做的事情,但他们很可能会引发#DE,这可能会被 SEH 捕获。

在其他情况下,可能没有什么比以更高的精度计算结果然后对其进行边界检查更好的了。