4

可能重复:
如何在处理负数的 C/C++/Obj-C 中编写模 (%) 运算符

据我了解(请参阅具有负值的模运算符模运算)C 和 C++ 有一个“余数”运算a % b符,但当 LHS 为负数时没有实际执行模运算的运算符。

几种语言确实具有这样的功能。是否可以在 C/C++ 中构建一个高效的函数(或者在 i686/x64 CPU 上没有有效的方法)?

目前我使用(n * b + a) % bwhere nis pick 这样我就可以确定整个 LHS 是非负数,但不可避免地会更改代码并且有时会出现错误。

注意:如果不清楚,模算术是指一个运算符,a + b % b = a % b对于所有整数a和所有正整数b

4

2 回答 2

14

没有简单的方法可以做到这一点,但是如果您创建一个两行解决方案,并节省乘法和确定,它会更有效n

inline int modulo(int a, int b) {
  const int result = a % b;
  return result >= 0 ? result : result + b;
}

此外,如果您还需要正确处理负数b,请添加到开头:

          if(b < 0) return modulo(-a, -b);
于 2012-08-23T10:29:19.873 回答
2

我建议使用与上述类似的函数,但使用inline int modulo(int a, int b) {}(就像该运算符存在于 C++ 中一样)。就个人而言,我不经常使用负数,并且仍然认为%只要代码不使用负数就应该保留。

于 2012-08-23T10:32:59.207 回答