MSVC编译器是否提供带溢出检查的数学运算内置函数?
MSVC 整数溢出检查相关内置函数说明
MSVC 已经提供了对应功能的内置函数,不需要手动从零实现溢出检查逻辑。
从 Visual Studio 2005 版本开始,MSVC 就新增了一系列前缀为 _addcarry、_subborrow、*_overflow 的内置函数,覆盖有符号、无符号整数的加减乘三类运算的溢出检查需求,和 GCC 内置的__builtin_add_overflow类函数功能对齐,性能和手写汇编级校验逻辑一致。
常用函数列表
无符号整数运算检查
- 无符号加法:
_addcarry_u<位宽>(0, 操作数1, 操作数2, &结果变量),位宽可选8、16、32、64,返回值为1代表发生溢出 - 无符号减法:
_subborrow_u<位宽>(0, 操作数1, 操作数2, &结果变量),返回值为1代表发生下溢(即操作数1小于操作数2,减法结果为负) - 无符号乘法:
_umul<位宽>_overflow(操作数1, 操作数2, &结果变量),返回值非0代表发生溢出
有符号整数运算检查
- 有符号加法:
_add<位宽>_overflow(操作数1, 操作数2, &结果变量) - 有符号减法:
_sub<位宽>_overflow(操作数1, 操作数2, &结果变量) - 有符号乘法:
_mul<位宽>_overflow(操作数1, 操作数2, &结果变量)
以上有符号运算函数返回值非0代表发生溢出,位宽同样支持8、16、32、64四种规格。
跨平台封装参考
如果你的代码需要同时兼容GCC和MSVC,可以用宏做一层统一封装,示例如下:
#if defined(__GNUC__) #define add_overflow(a, b, res) __builtin_add_overflow((a), (b), (res)) #define sub_overflow(a, b, res) __builtin_sub_overflow((a), (b), (res)) #define mul_overflow(a, b, res) __builtin_mul_overflow((a), (b), (res)) #elif defined(_MSC_VER) #include <intrin.h> #define add_overflow(a, b, res) _add_overflow((a), (b), (res)) #define sub_overflow(a, b, res) _sub_overflow((a), (b), (res)) #define mul_overflow(a, b, res) _mul_overflow((a), (b), (res)) #endif
只有当你需要兼容非常老旧的MSVC版本(低于2005)时,才需要手动实现溢出检查逻辑。
内容的提问来源于stack exchange,提问作者PMF
相关产品推荐
相关产品推荐

