在C中,%
运算符是一个余数运算符(a % b
产生 a − trunc(a/B)·B),但我想实现一个模运算符(a − floor(a/B)·B),它是溢出安全的。
特别是,mod(LONG_MIN, -1)
应该有定义的行为并产生0。(对于二进制补码,C标准没有定义LONG_MIN % -1
,因为它是通过引用除法定义的,LONG_MIN / −1
溢出。)
例如,以下代码实现了函数,但它不是溢出安全的:
long r = x % y;
if ((x ^ y) < 0 && r != 0) {
return r + y;
}
return r;
字符串
在C++中有没有一种有效的方法来实现这一点,而不需要特殊的溢出检查?或者只有在方法的开头添加一个溢出检查才能做到这一点?
2条答案
按热度按时间wlp8pajw1#
当余数为负时,您所需要的就是(小心地)加上商值
y
。以下是C11解决方案:
字符串
您可以使用其他类型特定的函数和泛型宏来支持所有标准整型:
型
对于C++,你可以使用重载来实现所有整型的
safe_modulus
:型
vkc1a9a22#
只需为边界情况添加额外的检查:
字符串