PMF*_*PMF 5 c++ integer-overflow visual-c++
在寻找对有符号和无符号整数算术进行溢出检查的函数时,我遇到了这个答案,它提供了很好的编译器内在函数,可以在 GCC 中进行检查数学。由于我当前编写的代码需要跨平台,因此我也需要 MSVC(Microsoft Visual Studio)编译器类似的东西。
是否存在或者我必须手动实现它?
对于无符号加法和减法,MSVC 有_addcarry_u16/32/64和,全部在<intrin.h>_subborrow_u16/32/64中定义。它们似乎会生成最佳代码,包括生成and而不是and如果您为进位传递常量 0。addsubadcsbb
不幸的是,没有类似的内部函数返回溢出标志。
\n对于 64\xc3\x9764 乘法,__mulh返回__umulh结果的高 64 位,可以在无符号情况下与 0 进行比较,也可以在有low >> 63符号情况下与 0 进行比较。还有_[u]mul128返回整个结果的函数,但我认为它们使用起来会更麻烦,并且会在优化后生成相同的代码(我还没有测试过)。
对于除法,有_[u]div64和_[u]div128,定义在 中<immintrin.h>。似乎没有记录他们在溢出的情况下会做什么,但他们很可能会引发 #DE,这可能会被 SEH 捕获。
在其他情况下,可能没有什么比以更高的精度计算结果然后对其进行边界检查更好的了。
\n