当前位置: 首页 > news >正文

C语言和Python在负数取余运算(%)上的差异

C语言和Python在负数取余运算(%)上的差异,源于它们对取模运算的数学定义和整数除法的舍入规则的不同选择。

取余运算的数学背景

在数学中,对于整数 ab(b ≠ 0),取余运算 a % b 的结果应满足:
a = q × b + r a=q×b+r a=q×b+r
其中:

  • q 是商(a / b 的计算结果)
  • r 是余数(a % b 的结果),且 |r| < |b|r 的符号取决于语言的定义。

关键分歧点在于:

  • q 如何舍入(向零、向下、向上取整?)
  • 余数 r 的符号(是否必须与被除数 a 同号?)

C语言的取余规则(向零截断)

C语言的标准(C99)规定:

  • 整数除法 / 向零截断(truncate toward zero),即直接丢弃小数部分。
  • 取余 % 的结果符号与被除数 a 相同。

在这里插入图片描述
在这里插入图片描述
当两个整数相除时,/ 运算符的结果是代数商,其小数部分被舍弃。118) 若商 a/b 是可表示的,则表达式 (a/b)*b + a%b 应等于 a;否则,a/b 和 a%b 的行为均为未定义。
脚注: 这通常称为 “向零截断”。

(虽未规定余数符号,明确要求 a = (a/b)*b + a%b,由实现定义。)

计算逻辑

q = t r u n c ( a / b ) ( 向零舍入 ) q=trunc(a/b)(向零舍入) q=trunc(a/b)(向零舍入)
r = a − q × b r=a−q×b r=aq×b

示例

  • 7 / 3 = 2,7 % 3 = 1
    (正常情况,无争议)
  • -7 / 3 = -2,-7 % 3 = -1
    (商向零截断为 -2,余数与被除数 -7 同号)
  • 7 / -3 = -2,7 % -3 = 1
    (商向零截断为 -2,余数与被除数 7 同号)

Python的取余规则(向下取整)

Python的取余规则遵循数学上的模运算(Floor Modulo):
整数除法 / 向下取整(floor division),即向负无穷方向舍入。

取余 % 的结果符号与除数 b 相同(保证 r ≥ 0)。

PEP 238:
在这里插入图片描述
// 运算符将明确用于执行向下取整除法。“floor division” 译为"向下取整除法",准确表达向负无穷方向舍入的数学含义。
Python 3 Documentation::
在这里插入图片描述
模运算符(%)的结果符号始终与第二个操作数相同(或为零),即明确余数符号与除数一致。

计算逻辑

q = ⌊ a / b ⌋ ( 向下取整 ) q=⌊a/b⌋(向下取整) q=a/b(向下取整)
r = a − q × b r=a−q×b r=aq×b

示例

  • 7 // 3 = 2,7 % 3 = 1
    (正常情况,无争议)
  • -7 // 3 = -3,-7 % 3 = 2
    (商向下取整为 -3,余数 2 与除数 3 同号)
  • 7 // -3 = -3,7 % -3 = -2
    (商向下取整为 -3,余数 -2 与除数 -3 同号)

总结对比

语言除法 / 舍入方向取余 % 符号规则数学保证
C向零截断与被除数 a 同号(a/b)*b + a%b == a
Python向下取整(负无穷)与除数 b 同号(a//b)*b + a%b == a

为什么会有这种差异?

C语言的设计初衷

  • 追求硬件友好性:早期计算机的除法指令通常直接截断(向零舍入),因此C语言沿用这一行为。
  • 效率优先:向零截断的除法运算速度更快。

Python的设计初衷

  • 数学一致性:Python选择模运算的数学定义,确保 (a // b) * b + (a % b) == a 始终成立,且余数非负。
  • 避免边界问题:在循环、哈希计算等场景中,非负余数更直观(如 array[index % length] 不会出现负索引)。

相关文章:

  • AUTOSAR图解==>AUTOSAR_TR_InteractionWithBehavioralModels
  • C++基本知识 —— 缺省参数·函数重载·引用
  • 2025年PMP 学习八 -第6章 项目进度管理
  • 方案精读:华为与中软-智慧园区解决方案技术主打胶片【附全文阅读】
  • 张量并行优质博客
  • AQS(AbstractQueuedSynchronizer)解析
  • Python模块与包以及工程文件管理
  • arctan x 导数推理
  • Spring Cloud : OpenFeign(远程调用)
  • LoRA(Low-Rank Adaptation)原理详解
  • 微服务架构-限流、熔断:Alibaba Sentinel入门
  • 【英语笔记(四)】诠释所有16种英语时态,介绍每种时态下的动词变形!!含有所有时态的的动词变形汇总表格
  • mybatis执行sql过程
  • MySQL用户管理
  • 解锁c++模板:从入门到精通
  • 二叉树三大遍历-精髓(Java)
  • Python 对象引用、可变性和垃圾 回收(标识、相等性和别名)
  • 酒店等场所客房沐浴用品批发要点:满足多样需求,把握关键环节
  • 精讲C++四大核心特性:内联函数加速原理、auto智能推导、范围for循环与空指针进阶
  • numpy模块综合使用
  • 有关部门负责人就《新时代的中国国家安全》白皮书答记者问
  • 农行深圳市分行原副行长王国彪涉嫌严重违纪违法被查
  • 2025年度十大IP!IP SH荣膺文化综合类TOP10
  • 专访|日本驻华大使金杉宪治:对美、对华外交必须在保持平衡的基础上稳步推进
  • 湖北石首市委副书记、市长付勇接受审查调查
  • 美国长滩港货运量因关税暴跌三成,港口负责人:货架要空了