-7 / 2 在 C 里是 -3,在 Python 里是 -4,谁算错了?
参考Andrew Koenig《C 陷阱与缺陷第二版》7.7节目录三条性质三条不可能同时成立C 到底保证了什么例子哈希表下标实测C 给的是哪一套同一个式子Python 给的是相反的答案Koenig 在 7.7 节一上来没写实现先问了一个问题「假定我们让 a 除以 b商为 q余数为 r。……我们希望 a、b、q、r 之间维持怎样的关系呢」然后列了三条。三条性质q*b r a——「最重要的一点……因为这是定义余数的关系」这条好理解这就是关于余数的反运算改变 a 的正负号q 的符号跟着变绝对值不变这是什么意思呢比如q 5 / 2 2r 5 % 2 1;此时改变被除数的符号 5 - -5 就有q -5 / 2 -2r -5 % 2 -1;此时也满足第一条-2*2 -1 -5但这样就会与第三条冲突b0 时保证r0且rb——「如果余数用于哈希表的索引确保它是一个有效的索引值很重要」还是以 -5 举例第三条应该这么运算q -5 / 2 -3r -5 % 2 1这样也满足第一条-3*2 1 -5但这样算与第二条就产生冲突了第 3 条不是凑数的。做哈希表下标余数必须是正数——这一点后面会用上。三条不可能同时成立书用3/2推导的3/2商 1余 1 —— 性质 1 满足没问题。(-3)/2呢先满足性质 2 → 商-1那余数必须是-1→ 性质 3 破了余数是负的。先满足性质 3 → 余数1→ 由性质 1 反推商是-2→ 性质 2 破了。两条路必破一条。书里的话因此C 语言或者其他语言在实现整数除法截断运算时必须放弃上述三条原则中的至少一条。大多数程序设计语言选择了放弃第 3 条而改为要求余数与被除数的正负号相同。注意这句「大多数程序设计语言选择了放弃第 3 条」。有 大多数就说明有例外。C 到底保证了什么然而C 语言的定义只保证了性质 1以及当a0且b0时保证|r|b以及r0。后面部分的保证与性质 2 或者性质 3 比较起来限制性要弱得多。性质 1 是标准钉死的性质 2 和性质 3 是编译器实际上这么干不是标准要求这么干。补一条后来发生的事C991999 年起标准明文规定整数除法向零截断——代数商去掉小数部分。性质 2 从此由标准兜底。但性质 3 到今天也没人保证。例子哈希表下标书设了一个场景n是标识符算出来的结果要通过除法得到哈希表项h满足0hHASHSIZE。如果已知n恒为非负一行就够h n % HASHSIZE;如果n可能为负:h n % HASHSIZE; if (h 0) h HASHSIZE;书最后还给了一条更省事的建议「更好的做法是程序在设计时就应避免 n 的值为负这样的情形并且声明 n 为无符号数。」到这里书讲完了。总结就是C 放弃了余数永远为正这条改用余数跟被除数同号。实测C 给的是哪一套#include stdio.h int main(void) { printf(-7 / 2 %d\n, -7 / 2); printf(-7 %% 2 %d\n, -7 % 2); printf( 7 / -2 %d\n, 7 / -2); printf( 7 %% -2 %d\n, 7 % -2); printf(-7 / -2 %d\n, -7 / -2); printf(-7 %% -2 %d\n, -7 % -2); return 0; }-7 / 2 -3 -7 % 2 -1 7 / -2 -3 7 % -2 1 -7 / -2 3 -7 % -2 -1两条规律跟书对得上商向零截断-7/2给-3不是-4。这就是性质 2——符号变了绝对值没变。余数跟被除数同号-7 % 2 -1跟 -7 的负号、7 % -2 1跟 7 的正号。这就是书说的大多数 C 编译器在实践中的做法。同一个式子Python 给的是相反的答案把同样几组数丢给 PythonPython 的/是浮点除所以对照要用整除//算式C 的/Python 的//C 的%Python 的%-7 ÷ 2-3-4-117 ÷ -2-3-41-1-7 ÷ -233-1-1前两行全部不一样而且余数的符号正好相反。规律也清楚了C余数的符号跟被除数Python余数的符号跟除数7 % -2给-1跟的是 -2回到第一章那三条性质——C 挑的是性质 2Python 挑的是性质 3。书说大多数程序设计语言选择了放弃第 3 条Python 就是那个没放弃的。所以谁算错了都没错。标准没规定的地方两种选择都合法。书那句大多数 C 编译器在实践中也都是这样做的——实践中三个字就是在说标准不管这事。

相关新闻

在MCP架构中,如何部署大模型、启动和初始大模型?MCP Client如何与大模型交互?TaoToken统一Key通道实践

在MCP架构中,如何部署大模型、启动和初始大模型?MCP Client如何与大模型交互?TaoToken统一Key通道实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 9:01:02 阅读更多 →
文华财经指标公式富途牛牛

文华财经指标公式富途牛牛

HH:HHV(HIGH,13); LL:LLV(LOW,13); HH1:BARSLAST((HH>REF(HH,1))); LL1:BARSLAST((LL<REF(LL,1))); DRAWTEXT(CROSS(HH1,LL1),90,众),COLORWHITE; DRAWTEXT(CROSS(LL1,HH1),90,4),COLORYELLOW; DRAWTEXT(CROSS(HH1,LL1),60,龙),COLORWHITE; DRAWTEXT(CROSS(LL1,HH1),60,8…

2026/10/25 0:03:12 阅读更多 →
Atomic Agent 源码阅读与贡献指南:从 AGENTS.md 不变式到三大评测框架

Atomic Agent 源码阅读与贡献指南:从 AGENTS.md 不变式到三大评测框架

Atomic Agent 源码阅读与贡献指南&#xff1a;从 AGENTS.md 不变式到三大评测框架 【免费下载链接】atomic-agent Atomic Agent is a local-first AI agent. Runs open-weight models on your own machine via llama.cpp. 项目地址: https://gitcode.com/gh_mirrors/at/atomi…

2026/10/24 4:09:09 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年&#xff0c;我大部分时间都在跟浏览器标签页打交道&#xff0c;直到第一次把桌面应用跑起来&#xff0c;才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词&#xff0c;最开始是在某段时间频繁出现在同事的讨论里&#xff0c;一个用HTML…

2026/11/6 15:21:35 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档&#xff0c;主要面向智能锁安装人员、终端用户及售后维护者&#xff0c;帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件&#xff0c;大小4.37MB&#xff0c;内容结构清晰&#xff…

2026/11/6 9:29:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统&#xff0c;整车要求空载跑到8m/s&#xff0c;电机转速已经拉到额定点&#xff0c;驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令&#xff0c;转速纹丝不动&#xff0c;三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/6 22:01:11 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年&#xff0c;用它写过嵌入式驱动、做过游戏服务端&#xff0c;也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词&#xff0c;我其实挺感慨的——这门语言的难点从来不是语法多&#xff0c;而是知识点之间的耦合太深…

2026/11/6 22:01:11 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书以PDF格式发布&#xff0c;适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开&#xff0c;先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能&#xff0c;再给出完整安装步骤&…

2026/11/6 8:08:42 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历&#xff1a;翻开源码注释、论文摘要或者一份专业报告&#xff0c;每个字都认识&#xff0c;连在一起却像天书。想找人聊聊&#xff0c;身边要么没人懂&#xff0c;要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型&#xff0c;几秒钟之后&a…

2026/11/6 22:01:09 阅读更多 →

日新闻

周新闻

月新闻