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

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] 不会出现负索引)。
http://www.xdnf.cn/news/5358.html

相关文章:

  • AJAX原理
  • python实战项目69:基于Python爬虫的链家二手房数据采集方法研究
  • HTTP 和 WebSocket 的区别
  • vue3模版语法
  • HTML12:文本框和单选框
  • 多源最短路径(Floyed)
  • 【人工智能】微调魔法:释放大模型的个性化潜能
  • 微机系统:第二章节:16位的intel8086处理器
  • 嵌入式硬件篇---无线通信模块
  • 【PostgreSQL系列】PostgreSQL性能优化
  • springboot3+vue3融合项目实战-大事件文章管理系统-参数校验优化
  • 十、STM32入门之低功耗蓝牙(基于ESP32C3芯片)
  • 【数据结构入门训练DAY-31】组合的输出
  • Nacos 起源
  • Docker 部署 - Crawl4AI 文档 (v0.5.x)
  • AI陪练 VS 真人教学
  • 19、DeepSeek LLM论文笔记
  • docker compose ps 命令
  • 三、Hive DDL数据库操作
  • 大模型中的temperature参数是什么
  • 实战项目2(03)
  • C++ 模板方法模式详解
  • [Java][Leetcode simple]26. 删除有序数组中的重复项
  • 关于物联网的基础知识(一)
  • C++ 核心基础:数字、数组、字符串、指针与引用详解
  • 物理机械:什么是泡利不相容原理?
  • 第6讲、全面拆解Encoder、Decoder内部模块
  • 【愚公系列】《Manus极简入门》031-商业模式创新师:“模式筛选者”
  • 栈Stack(附源码)
  • overleaf较高级的细节指令