C语言中有关取模和取余的问题
余数在数学中有重要的作用,在编程中也同样重要。不过,在不同编程语言中,有关余数的运算问题往往是不相同的。
对于正数的运算,相信有小学基础的人都能理解,没有什么问题:
- 14 / 6 = 2 ··· 2,因为 14 = 2x6+2
但对于负数的运算,可能会出现以下几种情况:
- -14 / 6 = -2 ··· -2,因为 -14 = (-2)x6+(-2)
- -14 / 6 = -3 ··· 4,因为 -14 = (-3)x6+4
- -14 / -6 = 2 ··· -2,因为 -14 = 2x(-6)+(-2)
- -14 / -6 = 3 ··· 4,因为 -14 = 3x(-6)+4
这说明 -14 除以 6 和 -14 除以 -6 都有两个余数,这是怎么回事呢?
在数学中,余数的定义如下:
如果 a 和 d 是两个自然数,d 不等于 0,可以证明存在两个唯一的整数 q 和 r,满足 a = q * d + r,且 0 ≤ r < d。其中,q 被称为商,r 被称为余数。
所以,数学中的余数只能大于 0,按照定义,-14 除以 -6 的余数只能是 4。不过很遗憾,许多编程语言并不按照数学的定义来。
取余运算(rem)
取余运算的步骤为:
- 计算商:c = a / b,商值 c 向 0 方向舍入
- 计算模或者余数: r = a - c * b
朝 0 取整:
- 当 c 为正时,舍弃其小数部分的值
- 当 c 为负时,也是舍弃其小数部分的值
- 比如,2.33 朝 0 取整后为 2,而 -2.33 朝 0 取整后为 -2
在 C 语言中 % 采用的是取余运算。
- 14 rem 6 = 2,因为 14 = 2x6+2
- -14 rem 6 = -2,因为 -14 = (-2)x6+(-2)
- 14 rem -6 = 2,因为 14 = (-2)x(-6)+2
- -14 rem -6 = -2,因为 -14 = 2x(-6)+(-2)
取模运算(mod)
取模运算的步骤为:
- 计算商:c = a/b,商值 c 向负无穷方向舍入
- 计算模或者余数: r = a - c * b
朝负无穷方向取整:
- 当 c 为正时,舍弃其小数部分的值
- 当 c 为负时,加 -1,舍弃其小数部分的值
- 比如,2.33 朝负无穷方向取整后为 2,而 -2.33 朝负无穷方向取整后为 -3
在 Python 中 % 采用的是取模运算。
- 14 mod 6 = 2,因为 14 = 2x6+2
- -14 mod 6 = 4,因为 -14 = (-3)x6+4
- 14 mod -6 = -4,因为 14 = (-3)x(-6)+(-4)
- -14 mod -6 = -2,因为 -14 = 2x(-6)+(-2)
本文作者:漫舞八月(Mount256)
本文链接:https://www.cnblogs.com/Mount256/p/17209553.html
版权声明:本作品采用CC 4.0 BY-SA许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了