3
数据编码
GESP 三级 · 知识点 1

🧠 数据编码

电脑里只有 0 和 1,没有「−」号——那负数是怎么存进去的?原码、反码、补码就是三套给数字「拍照存底」的规则,学完你就能读懂电脑脑子里的小算盘。

考纲知识点:原码、反码、补码
📖
考纲 · 知识点详述
摘自《CCF编程能力等级认证 C++&Python 认证标准》C++ 三级
  1. (1)了解二进制数据编码:原码、反码、补码。
📚
先学一学
花 5 分钟读完下面 4 课,再去闯关就不慌啦
1
⚡ 电脑只认 0 和 1,负数怎么办?

电脑身体里全是「小开关」:开 = 1、关 = 0。一个 0/1 叫一位(bit),8 位合起来叫一个字节(byte)。存正数很容易,比如 5 用 4 位二进制写是 0101。可是负数前面的「−」号往哪儿放呢?

🤔 第一招:原码(Sign 写在最左边)
人们想了个办法:用最左边一位当符号位——0 表示正数、1 表示负数,剩下几位照抄数值。这就是原码+5 = 0101−5 = 1101
💡 口诀:原码 = 符号位 + 数值照抄;最左 1 是负、0 是正。
⚠️ 原码有两个小毛病
① 0 有两种写法:+0 = 0000−0 = 1000,同一个 0 长两张脸。
② 拿原码做减法很麻烦(符号位不能一起加)。所以聪明人继续想:能不能让「负数也能直接加」?于是有了反码和补码。
💡 口诀:原码做减法不方便,0 还有两个分身,不完美。
2
🔁 反码和补码:负数的「变身规则」

记住最重要的一句:正数的原码 = 反码 = 补码,三个一模一样。只有负数才需要变身!以 4 位存 −5 为例:

🧪 亲手试试 +5
+5 是正数:原码 0101,反码还是 0101,补码也还是 0101。只有负数才走「取反→加 1」这条路。
💡 口诀:正数三码一个样;负数补码 = 反码 + 1。
3
⏰ 补码为什么最聪明:闹钟绕圈

把 4 位二进制想象成一面只有 16 个刻度的闹钟:0000、0001、…、1111。1111 再加 1 会「绕」回 0000。补码就是利用这种绕圈:1111 代表 −11110 代表 −2……就像钟表从 3 点往回拨 3 小时到 0 点,和往前拨 9 小时是一样的。

🧪 用补码做减法:5 − 5 = 0
5 的补码是 0101,−5 的补码是 1011。把它们直接相加:
0101 + 1011 = 10000
最左边多出来的第 5 位被丢掉(闹钟绕过头了),剩下 0000 = 0。减法变成加法,电路只需要一个加法器,超省事!
💡 口诀:补码让减法变加法,0 只有一种写法。
🌟 行业实际:int 的「闹钟」会溢出
真正的 C++ int 用 32 位补码存,最左边一位是 0 就是正数、是 1 就是负数,所以范围是 −2147483648 ~ 2147483647。加到最大值后再 +1,不会报错,而是像闹钟一样绕回最小的负数——这叫「溢出」,是很多老程序的著名 Bug 来源。
💡 口诀:首位 1 是负数;满到顶会绕圈,溢出不报错但结果错。
4
🆚 三码大对比 + 易混点
📊 以 −5(4 位)为例
· 原码 1101:最左是符号位,其余照抄。
· 反码 1010:符号位不动,其余取反。
· 补码 1011:反码 + 1。
💡 口诀:原码是「符号 + 数值」,反码是「取反」,补码是「取反再加一」。
⚠️ 两个最容易错的地方
① 千万别对正数也取反加 1——正数三码一样,变了就错。
② 看原码 1101 别直接读成 13:最左边是符号位不是数值!4 位里只有后 3 位是数值。
💡 口诀:符号位不参与算数值;负数才变身,正数不用变。
🎯
闯关小锦囊 · 考点提醒
🎮
学完了?来闯关!
下面 15 个小挑战,点一点就能玩

Demo 原型 · 每个知识点独立页面 · 暂不含真实编译与进度存储。