对负数进行模运算

时间:2015-05-12 19:07:04

标签: c modulo negative-number

模运算a%b返回a/b的余数,但对于负数,它不会返回。{/ p>

#include <stdio.h>

int main(void) {
  int n=-4;
  printf("%d\n",n%3);
  return 0;
}

它应返回2为3 *( - 2)= - 6小于-4且倍数为3但输出为-1。 为什么将(-a) mod b视为-(a mod b)

2 个答案:

答案 0 :(得分:5)

作为一般规则,模和除法应满足等式

b * (a/b) + a%b == a

对于正数,很明显这意味着a%b必须是正数。但如果a/b为负数,则结果将舍入为零。

例如, a = -4, b = 3.我们知道 a / b = -1.3333,向零舍入变为a/b == -1。从上面的等式,我们得到b * (-1) + a%b == a。如果我们插入ab,我们会得到-3 + a%b == -4,并且我们会看到a%b必须为-1。

答案 1 :(得分:4)

你的痛苦源于拥抱%是一个“模数”算子的错觉。事实上,它是一个余数运算符(C11§6.5.5):

  

/运算符的结果是除法的商   第二个的第一个操作数; %运算符的结果是   其余

拒绝幻觉并接受真相,操作员的行为将变得清晰(同上。):

  

如果商a/b可表示,则表达式(a/b)*b + a%b   应等于a

在您的情况下,a/b-4/3,即-1,因此可以代表。所以a%b满足:

(a/b)*b + a%b =  a
(-1)*3  + a%b = -4
  -3    + a%b = -4
          a%b = -1