1.1.3 码制
本节导学:码制是在解决“二进制如何表达正负并参与运算”
学十进制时,+7、-7 的正负号可以直接写在数字前面;到了计算机内部,所有信息都必须落到固定长度的 0/1 序列里。码制这一节的核心不是背四个名词,而是看清一条技术演进线:
软考题通常不要求推导硬件电路,但会反复考三件事:给一个码能不能读出真值,给一个字长能不能算表示范围,给一个应用场景能不能判断为什么要用这种码。
1. 机器数、真值与符号位
人的数学表达叫真值,比如 +13、-13。计算机里保存的固定二进制串叫机器数。机器数的最高位通常承担符号功能:0 表示正,1 表示负。
这里要特别注意“数值相关位”这个说法。对原码来说,它就是绝对值;对反码、补码来说,它已经参与编码规则,不能再直接当作绝对值读。
2. 四种码制的技术取舍
| 码制 | 正数规则 | 负数规则 | 主要优点 | 为什么不够好或为什么被采用 |
|---|---|---|---|---|
| 原码 | 符号位为 0,数值位写绝对值 | 符号位为 1,数值位写绝对值 | 直观,人与机器都容易读 | +0 和 -0 重复;加减法不能直接统一到加法器 |
| 反码 | 与原码相同 | 符号位不变,数值位按位取反 | 比原码更接近补码运算思想 | 仍有 +0 和 -0;加法出现最高进位时还要“回卷”处理 |
| 补码 | 与原码相同 | 反码加 1 | 加法器可以统一处理加法和减法;0 唯一;编码数量用满 | 人读负数不如原码直观,但硬件实现更划算,所以成为整数运算主流 |
| 移码 | 真值整体加偏置,或在软考常见口径下“补码符号位取反” | 同左 | 编码顺序更便于比较大小 | 主要适合阶码、偏置指数等场景,不是整数加减运算的主力 |
这张表要按“为什么会替代”来记:原码输在运算,反码输在仍有两个 0,补码赢在硬件统一性,移码赢在比较便利性。
3. 用 -7 把转换链走一遍
8 位机器数中,+7 的二进制绝对值是 0000111。写成带符号的 8 位机器数时:
真值:-7
原码:10000111 最高位 1 表示负,其余位 0000111 表示绝对值 7
反码:11111000 符号位不动,数值位 0000111 逐位取反
补码:11111001 反码基础上加 1
移码:01111001 常见软考口径:补码符号位取反正数在原码、反码、补码下形式相同,这是很多题的快捷入口。只有当最高位为 1 时,才需要根据题目指定的码制继续解释。
4. 为什么补码能把减法变成加法
计算机硬件里,加法器比“既会加又会减的复杂电路”更容易统一设计。补码的目标就是把:
A - B转成:
A + (-B 的补码)看一个 4 位例子,计算 1 + (-1):
+1 的补码:0001
-1 的补码:1111
0001
+ 1111
------
1 0000固定 4 位机器数只保留低 4 位,最高进位丢弃,结果就是 0000,也就是唯一的 0。这个设计带来两个结果:
- 减法可以交给加法器完成。
- 原来原码里的
-0编码空间不再浪费,被用来表示最小负数。
所以
8 位补码能表示 -128 到 +127,负数比正数多一个,就是因为 10000000 被定义为 -128。
5. 三位二进制小表:看清“人为定义”
课程里强调“补码、移码有些值是人为定义的”,可以用 3 位编码快速看清。
| 编码 | 原码真值 | 反码真值 | 补码真值 | 移码真值(按补码符号位取反口径) |
|---|---|---|---|---|
000 | +0 | +0 | 0 | -4 |
001 | +1 | +1 | +1 | -3 |
010 | +2 | +2 | +2 | -2 |
011 | +3 | +3 | +3 | -1 |
100 | -0 | -3 | -4 | 0 |
101 | -1 | -2 | -3 | +1 |
110 | -2 | -1 | -2 | +2 |
111 | -3 | -0 | -1 | +3 |
这张表背后的规律比表本身重要:
- 原码、反码都有两个 0,因此可表示的不同真值只有
个。 - 补码没有
-0,因此个编码全都对应不同真值。 - 移码把有符号范围平移成更利于大小比较的编码序列,常用于浮点数阶码。
6. 表示范围:先数编码,再看 0 是否重复
设字长为
定点整数
| 码制 | 真值范围 | 可表示的不同真值个数 | 记忆抓手 |
|---|---|---|---|
| 原码 | 最高位表符号,数值位最大全 1;两个 0 重复 | ||
| 反码 | 和原码范围相同;两个 0 重复 | ||
| 补码 | 最小负数多一个;0 唯一 | ||
| 移码 | 与补码真值范围一致,编码顺序不同 |
定点小数
定点小数常默认小数点在符号位之后,例如:
符号位 . 数值位
S . b1 b2 b3 ... b(N-1)| 码制 | 真值范围 |
|---|---|
| 原码/反码 | |
| 补码/移码 |
整数和小数的范围最容易混。判断方法很简单:题目若说“定点整数”,小数点在最右边;题目若说“定点小数”或“尾数为纯小数”,小数点在符号位后面。
7. 读码题的标准步骤
进制转换和码制经常组合考。遇到十六进制机器数时,不要直接猜真值,按下面顺序做:
- 十六进制先转二进制,1 位十六进制对应 4 位二进制。
- 看题目说的是原码、反码、补码还是移码。
- 看最高位。最高位为
0时,多数情况下直接按正数读。 - 最高位为
1时,严格按对应码制还原。 - 最后再把二进制绝对值转回十进制。
补码负数还原常用口诀:
看符号位为 1 → 判断为负数
对整个补码取反加 1 → 得到绝对值
真值 = -绝对值移码题要看题干口径:如果给了偏置值,就用“真值 = 移码值 - 偏置”;如果按软考常见的“补码符号位取反”,就先把符号位翻回来当补码读。
8. 本节考点地图
| 题型 | 题干信号 | 解题动作 |
|---|---|---|
| 转换题 | “求 -X 的原码/反码/补码/移码” | 先写绝对值,再按负数规则逐步转换 |
| 读码题 | “某机器数为 XXXX,采用补码表示” | 先判符号位,再按补码还原真值 |
| 范围题 | “字长 N 位,含符号位” | 先选整数/小数,再选码制公式 |
| 综合题 | “十六进制 + 补码/移码 + 真值” | 十六进制转二进制,再读码 |
| 概念题 | “哪种码适合运算/阶码比较” | 运算选补码,阶码比较常选移码 |
🧪 例题(按难度)
简单(3题)
例题1(范围题)
中级(3题)
例题2(综合:进制 + 补码读码)
例题3(定点小数范围)
困难(1题)
📚 本课小结
- 原码/反码:直观但存在 +0/-0,运算不友好
- 补码:计算机加减运算核心,范围更“满”(
可取到) - 移码:常用于浮点阶码,便于大小比较
- 高频考法:范围/个数 + 进制转换 + 读码(补码/移码)综合