news 2026/10/1 14:42:27

负数凭什么“反着存“?补码——一场让“减法“从计算机里消失的天才设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
负数凭什么“反着存“?补码——一场让“减法“从计算机里消失的天才设计

你写过无数个int a = -5;,但你停下来想过没有——那个-5,在内存里到底长什么样?

内存里只有 0 和 1,没有"负号"这个东西。那"负"这件事,是怎么被塞进 32 个比特里的?

直觉会告诉你:这还不简单,最高位放个符号位,0 是正、1 是负,剩下 31 位存绝对值。这就是原码。听起来天衣无缝,可你真拿它做一次加法,就露馅了。

原码:看着顺眼,一算就崩

用 4 位(方便演示)算一下1 + (-1):

  • +1的原码是0001
  • -1的原码是1001(最高位符号位是 1)

直接相加:0001 + 1001 = 1010,最高位是 1,表示负数,值是-2。

1 + (-1) = -2?错得离谱。

更尴尬的是,原码里还有两个"零":0000是+0,1000是-0。CPU 每次判断"结果是不是零",都得特判两次。加法器看到这玩意儿,只想掀桌。

反码:离对近了一步,但还差一点

有人想:负数的表示,把符号位之外的所有位取反行不行?这就是反码。

  • -1的反码 =1001取反(符号位不动)→1110

再算1 + (-1):0001 + 1110 = 1111。1111是-0(反码的负零)。结果是零了,方向对了,但那个恼人的-0还在。

补码:多走一步,减法当场失业

在反码基础上再加 1,就是补码:

  • -1的补码 =1110 + 0001 = 1111

注意,4 位里-1的补码是1111。再算1 + (-1):0001 + 1111 = 10000,4 位存不下最高位的进位,直接丢掉,剩下0000。等于 0。

成了。而且这次,-0也消失了——补码里0000是唯一的零。

为什么"取反再加一"这么神?钟表早就告诉过你

这背后的原理,其实是一个你从小就会的概念:模。

想象一块 12 点的钟。现在是 12 点,你想"倒拨 5 小时"到 7 点;也可以"正拨 7 小时",同样到 7 点。因为钟的模是 12,-5和+7在模 12 下是同一个东西。

计算机里的 n 位二进制,模是2^n。所谓-x的补码,本质就是2^n - x,也就是"把负数抬到模的另一个等价值上"。

那"取反再加一"是从哪冒出来的?拆一下就清楚了:

2^n - x = (2^n - 1 - x) + 1

2^n - 1是一串全 1(比如 4 位就是1111)。全 1 减去 x,等于把 x 的每一位取反。所以"取反"对应(2^n - 1 - x),再"加 1"补上那个+1。就这么来的,没有魔法。

补码顺手办了另一件大事:减法消失了

CPU 里其实没有减法电路。那7 - 3是怎么算的?

把-3转成补码,然后7 + (-3 的补码)直接走加法器:

0111 (7) + 1101 (-3 的补码) = 10100 → 丢掉进位 → 0100 (4)

一条加法电路,同时干加法和减法的活。硬件省了一大块,这是补码最硬核的价值——把"别扭"一次性留给"人理解",把"简单"永久留给"机器执行"。

顺带:为什么 8 位是 -128 ~ 127,多出一个 -128?

8 位补码能表示的范围是-128 ~ 127,负数比正数多一个。原因就在于那个"唯一的零":正数占掉0 ~ 127共 128 个,剩下1000 0000这个最高位是 1 的数,不再需要表示-0了,就腾给-128。

408 提示:补码是"数据的表示与运算"里的核心,选择题、计算题都爱考。重点抓三件事——补码的定义与转换、“取反加一”、补码的表示范围与溢出判断。

一个反直觉的设计,凭什么活了半个世纪

补码看着别扭:你要读一个负数,得先"取反加一"才算得回它的值。但设计者清楚地知道,这种"别扭"只发生在人看的时候,而"爽"却发生在机器每一次执行加法的时候。用一次性的理解成本,换一辈子的执行成本,这笔账,划算得不能再划算。

关于"数据表示"还有一件更反直觉的事——浮点数加减法里,0.75 + 0.125这种看着整整齐齐的数,CPU 也不能直接加,要先"对阶"再"舍入"(0.75 + 0.125,CPU 竟不能"直接"加?浮点加减的对阶与舍入,一次算给你看)。补码和它,其实是同一套逻辑:机器的"简单",从来不是白来的。

从 ENIAC 到今天你手里的手机,CPU 的指令集换了一茬又一茬,唯独"负数用补码存"这件事,半个多世纪纹丝不动。真正好的设计,不是"你觉得顺眼",而是几十年后回头看,发现找不到一个更好的替代。

想把这些底层原理串成体系,为计算机考研打好底子,推荐 B站【408实验室】的《数据结构》系统跟学。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 14:42:26

GLM Coding Plan 全量上线 GLM-5.3: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/10/1 14:42:20

从一张普通人脸到直播画面:视频美颜SDK经历了哪些处理?

在直播、视频社交、短视频等场景中,“美颜”通常被认为只是给视频增加一个滤镜。但从软件开发的角度来看,一套完整的视频美颜SDK实际上涉及视频采集、人脸检测、关键点定位、图像分割、纹理处理、几何变形以及实时渲染等多个环节。如果把摄像头输出的一帧…

作者头像 李华
网站建设 2026/10/1 14:42:02

SSM高职教学分析系统源码部署与可视化分析实战指南

简介:面向高职院校师生及Java初学者,这份源码工程完整实现了基于SSM框架的可视化教学分析系统,涵盖前后端、MySQL数据库及说明文档,可用于毕业设计、课程设计或SSM整合开发练习。包体共909个文件,约9.21MB,…

作者头像 李华
网站建设 2026/10/1 14:40:58

ThinkSystem 服务器英韧硬盘固件更新,Broadcom RAID 卡下升级完整步骤

企业运维工作中,服务器 SSD 硬盘微码(固件)升级是一项很重要的维护工作,修复已知 bug、提升稳定性、规避潜在硬盘故障风险。针对联想 WR5220 G3 服务器搭载英韧 ESS5600 SATA SSD 场景,很多运维同学会困惑:…

作者头像 李华
网站建设 2026/10/1 14:40:25

MEMS力触觉传感器的硬核科技:硅应变片与玻璃微熔工艺

传统六维力传感器绝大多数采用金属箔应变片和胶结工艺制备,即通过胶水将金属箔应变片粘接在弹性体上。长时间贮存和使用后,胶结工艺易老化、松动,这个问题数十年无人解决。而精一微感选择了一条更具挑战和前景的技术路线:MEMS 硅应…

作者头像 李华
网站建设 2026/10/1 14:39:12

ChatGPT手机远程控制Mac Codex:TaoToken统一Key打通AI自动编程链路

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

作者头像 李华