C中模数函数的深度工作

时间:2014-07-28 16:07:49

标签: c operators

函数的输出将是4,但我无法理解为什么会这样。如果你可以推断x%y时的情况,当y>时,我们非常感激。 X

int main()
{
 int x=4%5;
 printf("x=%d\n",x);
 return 0;
}

3 个答案:

答案 0 :(得分:3)

4 / 5 = 00 * 5 + 4 = 4,其余为4

C将余数运算符%定义为(在c11中,6.5.5p6):

(a/b)*b + a%b shall equal a.

答案 1 :(得分:0)

模数运算将为x%y,如果x> y且y> x,则存在两个条件。如果x> y,则操作后的余数x / y将是答案。如果y> x,x将是答案,因为如果4%5它将首先计算4/5并且它将是0.因此0 * 5 + 4将是等式而4是余数。因此,如果在x%y中,如果y> x,则输出将为x。

答案 2 :(得分:0)

FWIW,这里a%b对于消极,零和正a做了什么,其中b是+3和-3:

  a = -6:  b=+3  a/b = -2  a%b = +0  :  b=-3  a/b = +2  a%b = +0
  a = -5:  b=+3  a/b = -1  a%b = -2  :  b=-3  a/b = +1  a%b = -2
  a = -4:  b=+3  a/b = -1  a%b = -1  :  b=-3  a/b = +1  a%b = -1
  a = -3:  b=+3  a/b = -1  a%b = +0  :  b=-3  a/b = +1  a%b = +0
  a = -2:  b=+3  a/b = +0  a%b = -2  :  b=-3  a/b = +0  a%b = -2
  a = -1:  b=+3  a/b = +0  a%b = -1  :  b=-3  a/b = +0  a%b = -1
  a = +0:  b=+3  a/b = +0  a%b = +0  :  b=-3  a/b = +0  a%b = +0
  a = +1:  b=+3  a/b = +0  a%b = +1  :  b=-3  a/b = +0  a%b = +1
  a = +2:  b=+3  a/b = +0  a%b = +2  :  b=-3  a/b = +0  a%b = +2
  a = +3:  b=+3  a/b = +1  a%b = +0  :  b=-3  a/b = -1  a%b = +0
  a = +4:  b=+3  a/b = +1  a%b = +1  :  b=-3  a/b = -1  a%b = +1
  a = +5:  b=+3  a/b = +1  a%b = +2  :  b=-3  a/b = -1  a%b = +2
  a = +6:  b=+3  a/b = +2  a%b = +0  :  b=-3  a/b = -2  a%b = +0

表示:a == ((a / b) * b) + (a % b)正如所宣传的那样。你会发现b的符号并不重要,结果与a的符号相同。

另外,((-a) % b) == -(a % b) - 也就是说,您可以计算a % b将采用两者的绝对值进行的操作,并将结果赋予a的符号。< / p>

注意a / b(对于整数)被定义为&#34;截断(朝向零)&#34; (C99 6.5.5),因此对于-2 / +3,答案是0。这对%的定义很重要。正是这种截断导致上面的图案关于零对称。

进一步注意, 与常规算术余数(每欧几里德除法)相同,其余值始终为正(或零) - 与任一参数的符号无关。欧几里德分部说:q = a / b, where a = q * b + r, and 0 <= r < abs(b),其中r是余数。这给出了不同的模式:

  a = -6:  b=+3  q=-2  r=0  :  b=-3  q=+2  r=0
  a = -5:  b=+3  q=-2  r=1  :  b=-3  q=+2  r=1
  a = -4:  b=+3  q=-2  r=2  :  b=-3  q=+2  r=2
  a = -3:  b=+3  q=-1  r=0  :  b=-3  q=+1  r=0
  a = -2:  b=+3  q=-1  r=1  :  b=-3  q=+1  r=1
  a = -1:  b=+3  q=-1  r=2  :  b=-3  q=+1  r=2
  a = +0:  b=+3  q=+0  r=0  :  b=-3  q=+0  r=0
  a = +1:  b=+3  q=+0  r=1  :  b=-3  q=+0  r=1
  a = +2:  b=+3  q=+0  r=2  :  b=-3  q=+0  r=2
  a = +3:  b=+3  q=+1  r=0  :  b=-3  q=-1  r=0
  a = +4:  b=+3  q=+1  r=1  :  b=-3  q=-1  r=1
  a = +5:  b=+3  q=+1  r=2  :  b=-3  q=-1  r=2
  a = +6:  b=+3  q=+2  r=0  :  b=-3  q=-2  r=0

这显然不再是关于零的对称。但是qr的模式在无穷大处开始,并且从零到达+无限(以及超越)继续前进。