【问题标题】:Are there overflow check math functions for MSVC?MSVC 是否有溢出检查数学函数?
【发布时间】:2021-12-02 12:20:06
【问题描述】:

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

是否存在或者我必须手动实现它?

【问题讨论】:

标签: c++ visual-c++ integer-overflow


【解决方案1】:

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

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

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

对于除法,有_[u]div64_[u]div128,定义在&lt;immintrin.h&gt;中。他们在溢出的情况下做了什么似乎没有记录,但他们很可能会引发#DE,这可能会被 SEH 捕获。

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

【讨论】:

  • 看起来差不多了。 _addcarry_u32 返回进位标志,这正是所需要的。我今天会测试这些。
  • intsafe.h,上面汉斯提到的似乎更完整一些,但两者都在做,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 2015-02-07
  • 2020-11-14
  • 2020-08-15
相关资源
最近更新 更多