K.I.S.S---Keep IT Simple,Stupid!    人生苦短,我用Python

为什么计算机内部,是使用补码来表示二逝制数

 
分类: 问答 2025年6月5日

先理解:什么是补码? 对于一个整数:

正数的补码就是它本身的二进制。

负数的补码 = 原码取反 + 1。

例如用 8 位二进制表示:

+5 = 00000101

-5 的补码 = 11111011

 

历史背景

  • 1945年:著名数学家冯·诺依曼在《EDVAC报告草案》中首次提出补码概念,但未命名。

  • 1947年:计算机先驱 Howard Aiken 在哈佛 Mark II 计算机的文档中首次使用 "Complement of Two" 术语。

  • 1951年:IBM 701 计算机(首台商用科学计算机)正式采用补码,推广了 "Two's Complement" 名称。

命名逻辑
早期计算机文献需区分 "对1取补"(反码) 和 "对2^N取补"(补码)
因此明确称其为 "Two's Complement"(基于基数2^N)而非反码的 "One's Complement"(基于2^N-1)。

 

计算机内部使用补码(Two's Complement)来表示有符号的二进制整数,原因并不是“随便选的”,而是因为它具有多个数学与工程上的优势,使得加减法电路可以统一且高效。

Two's Complement”这个名字的来由,其实和它的数学定义是完全对应的。它直译过来就是:

“二的补数”,即:补到最近的 2 的整数倍(如 2⁸、2¹⁶)所需要加上的量。

 

 

、数学本质:模运算系统

补码的本质是模 2ⁿ 的数学系统(n为位数):

例如4位系统:模 = 2⁴ = 16
-3 ≡ 13 (mod 16) → 13的二进制:1101(即-3的补码)
  • 减法等价A - B ≡ A + (16 - B) mod 16

  • 溢出即取模:结果超过16时自动截断

核心思想:负数被映射到大于一半模的正数区间,实现运算统一

 

 

特性/表示法 原码 反码 补码(实际使用)
零的表示 两种 两种 只有一种
加法逻辑 需分情况 需考虑进位 可直接加法处理
负数表示 最高位为1,其余同正数 逐位取反  取反 + 1
硬件实现复杂度 最低

PS:反码英文名:One's Complement

 

总结:为什么用补码? 补码使得硬件设计更简单,加减法统一,逻辑判断更高效,且没有冗余的零。

这是从“电路效率 + 数学一致性”两个角度得出的最优方案。 正因如此,现代几乎所有计算机体系结构(x86, ARM 等)都采用 补码 作为整数的内部表示方式。

补码的三大革命性贡献

  1. 硬件层面

    • 单一加法器完成所有整数组算

    • 消除符号位特殊处理电路

  2. 数学层面

    • 建立基于模运算的封闭代数系统

    • 实现数值表示的无缝连续

  3. 工程层面

    • 100%位模式利用率

    • 零值唯一性保障

    • 跨平台运算一致性

正因这些突破性优势,自1950年代IBM 704计算机首次采用后,补码成为现代计算机整数表示的事实标准。




注:当前文章会不定期进行更新。如果您对本文有更好的建议,有新资料推荐, 可以点击: 欢迎分享优秀网站
这个位置将来会放广告

我想等网站访问量多了,在这个位置放个广告。网站纯公益,但是用爱发电服务器也要钱啊 ----------狂奔的小蜗牛