截断除法与负数取模

在计算机中,整数a对整数b取模的结果为r = a - trunc(a/b)。显然,取模的结果依赖于trunc的定义。

主流的trunc定义有两种:向下取整(记为trunc_down)和向0取整(记为trunc_zero)。主要区别在被操作数是负数时的行为。例如trunc_down(-3.1) = -4trunc_zero(-3.1) = -3

ab都是正整数时,两种定义的取模结果都符合直觉,与小学学习的余数运算相同。但是当ab不全为正整数时,取模运算便超出了小学学习的余数运算,两种定义的取模结果也不尽相同。

两种运算的结果示例如下。

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,当ab同号时,规律与trunc_zero相同;当ab异号时,r = sign(b)(abs(b) - abs(a) % abs(b))

Python采用trunc_down模式,C/C++采用trunc_zero模式。

posted @   Anrcy  阅读(38)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示