截断除法与负数取模
在计算机中,整数a
对整数b
取模的结果为r = a - trunc(a/b)
。显然,取模的结果依赖于trunc
的定义。
主流的trunc
定义有两种:向下取整(记为trunc_down
)和向0取整(记为trunc_zero
)。主要区别在被操作数是负数时的行为。例如trunc_down(-3.1) = -4
,trunc_zero(-3.1) = -3
。
当a
和b
都是正整数时,两种定义的取模结果都符合直觉,与小学学习的余数运算相同。但是当a
和b
不全为正整数时,取模运算便超出了小学学习的余数运算,两种定义的取模结果也不尽相同。
两种运算的结果示例如下。
a |
b |
trunc_down(a/b) |
a%b |
trunc_zero(a/b) |
a%b |
---|---|---|---|---|---|
11 | 5 | 2 | 1 | 2 | 1 |
11 | -5 | -3 | -4 | -2 | 1 |
-11 | 5 | -3 | 4 | -2 | -1 |
-11 | -5 | 2 | -1 | 2 | -1 |
trunc_zero
的规律很好记,即r = sign(a)(abs(a) % abs(b))
。
对于trunc_down
,当a
和b
同号时,规律与trunc_zero
相同;当a
和b
异号时,r = sign(b)(abs(b) - abs(a) % abs(b))
。
Python
采用trunc_down
模式,C/C++
采用trunc_zero
模式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)