C语言深度理解 负数取余 取模
关于取余和取模的问题
许多小伙伴在刚开始学C语言的时候,知道了什么是取余或者取模。
比如10 % 3,可以轻而易举的得出答案是1。
许多教材上或者老师教的时候往往都是用正数计算的,那么小伙伴们有没有想过如果是**负数和正数之间%**会出现什么情况?
还有有没有想过**取余和取模一样吗**?
这篇文章让我们再来重新理解一下取余和取模的概念。
定义

这个公式很好理解。我们以10 % 3 为例。
先算出q = 10 / 3 = 3
那么a = 10 q = 3 d = 3
得出 10 = 3*3 + r 所以r = 1
我们的余数就是1
了解这个取余定义后,接下来我们直接进入主题
取余时有负数怎么计算?
我们现在要算 -10 % 3
我们先算出q,q = -10 / 3 = -3
然后代入上面的公式
-10 = (-3*3 )+ r
我们得到余数r为-1
这时肯定会有小伙伴会觉得,既然我加了一个负号那最后的结果也只是加了和负号而已啊。
那我们再试试 10 % -3
我们先算出q,q = 10 / -3 = -3
然后代入上面公式
10 = (-3 * -3) + r
我们余数r 为 1
两个结果显然是不同的,所以利用这个公式可以帮助我们轻而易举地计算出负数和正数以及负数和正数之间的取余。
取余和取模的区别
这里需要涉及到 向负无穷大取整和向零取整的概念。不了解的小伙伴可以点击这个链接去看一下
C语言深度理解 取整
我们知道,C语言中我们默认是向0取整的
因此在计算-10 / 3 时,结果是-3
而如果有编程语言,比如Python,默认是向负无穷大取整的话
-10 / 3 ,结果是-4
那么在这种向负无穷大取整的方式下,
我们利用刚才的公式计算一下
先求出 q = -10 / 3 = -4
然后代入公式 -10 = (-4 * 3) + r
我们得到r=2
而在刚才的向0取整的方式下,
我们计算 -10 % 3 = -1
所以,两种不同的结果,本质上因为所得“商”不同,而取整方式导致了商的不同。
这里得到的两个不同的结果,我们称为“正余数”和“负余数”
说了这么多,我们给出取余和取模的区别了。
取余:让商进行向0取整
取模:让商进行向负无穷大取整
取余和取模时候等价什么时候不等价
我们直接给出结论:
参与取余的两个数据,
1.如果同符号,那么取余就是取模
2.如果两个数据符号不同,那么取余不等价与取模
第一个结论我们举个例子
先拿 10 % 3 来说。
在默认向0取整的C语言中,我们计算q = 10 / 3 = 3
在默认向负无穷大取整的Python中,我们计算 q = 10 / 3 = 3
我们可以发现商的结果是一样的。
所以这时取余和取模等价
因为一个大于0的数按照这两种方式取整时,都会在数轴上往左边走
既然这样,那我们取整的结果是一样的。
这时候两种不同的取整方式经过公式计算得到 余数都为r=1
这也就是为什么在书上或者教学中,我们学习%都采用两个正数计算的原因,因为学的浅,也很好理解,只需要知道是因为余数为1所以结果就是1就行了。不需要去更深入的去讨论取整方式的概念。
第二个结论我们再举个例子
拿-10 % 3来说
在默认向0取整的C语言中,我们计算 q = -10 / 3 = -3
在默认向负无穷大取整的Python中,我们计算 q = -10 / 3 = -4
这个时候计算出来的商就不一样了,这时候取余和取模就不等价了。
一个往数轴右边取整,一个往数轴左边取整。
计算出来的-10 % 3也就不一样了。
总结
不管是正数%负数,还是负数%正数。
只要我们知道取整方式,先计算出两者的商,再代入公式
就可以得出相应的余数了。