区分求模和取余

在C语言或者其他语言中,% 是一个常用的操作,我们有的时候管他叫“取余”(REM),有的时候又管它叫“求模”(MOD)。本来我以为这两者是一样的,后来才发现它们并不相同。

首先不管对于求模还是取余,这两者的操作方法都是一样的,假设有两个数 a 和 b,要求 r = a % b,则

  1. 求整数商:c = a / b
  2. 求模或者余数:r = a - b * c

求模和取余两者的区别就在于对 a / b 的处理不同。在求模运算中, a / b 向无穷小方向舍入,而在取余运算中,a / b 向 0 方向舍入

举个例子来说,假设 a = -7, b = 4,则
若是求模运算,则 c = -7 / 4 = -2,所以 r = -7 - 4 (-2) = 1,即模为 1。
若是取余运算,则 c = -7 / 4 = -1,所以 r = -7 - 4
(-1) = -3,即余为 -3。

实际上,当被除数和除数的符号相同的时候,求模和取余两者结果是相同的,但当两者符号不同的时候,就显现出不同了

下面举几个简单的例子:

  1. 3 / 4 余数为 3,模为 3
  2. -3 / 4 余数为 -3, 模为 1
  3. -3 / -4 余数为 -3, 模为 -3
  4. -6 / 5 余数为 -1 ,模为 4
  5. 5 / -3 余数为 2, 模为 -1

从上面的例子中,我们可以发现一个规律,即余数的符号和被除数 a 的符号相同,而模的符号和除数 b 的符号相同

另外还要提一下的是,在 C语言、Objective-C、Swift 等语言中,% 是一个“取余”的操作符,而在 Python 等语言中,% 则是一个“求模”的运算符