Appearance
真值与机器数:四种编码的定义
大纲定位
二(一)2 定点数的编码表示
要求:掌握原码、反码、补码、移码四种编码的定义、表示范围与零的表示。本篇是定义篇;具体怎么转、卷面怎么写,见 定点数编码的转换与书写。
考情分析
408 的题型只有单项选择题和综合应用题两类。本考点是整章的地基——补码加减、溢出判断、IEEE 754 全建立在它之上。选择题里最常出现的是边界值辨析(最小负数、
、同一位串的不同解释)。
全篇符号约定
本篇统一用
有些教材用
真值与机器数
真值:带正负号的实际数值,如
机器数:连符号一起编码成 0/1 位串放进寄存器的形式。机器里没有"负号"这个符号,正负必须编码进去。
把真值变成机器数有四种编码方式:原码、反码、补码、移码。它们的差别只在负数怎么编——正数在四者中除移码外完全相同。
原码
符号位取真值的正负(正 0 负 1),数值位直接写绝对值。
式中
表示范围:
零有两个:
原码的好处是直观、乘除方便;坏处是加减法要先比较绝对值再决定做加还是做减,硬件麻烦——这正是补码出现的动机。
反码
正数与原码相同;负数是原码的数值位按位取反(符号位不变)。
表示范围:与原码相同,
零也有两个:
反码现在几乎不单独使用,它的主要角色是求补码的中间步骤。
补码
正数与原码相同;负数是反码加 1。
表示范围:
零唯一:
补码为什么能用加法做减法
关键在模运算。钟表是个模 12 的系统:时针从 6 点拨到 3 点,可以逆时针拨 3 格(
只要用
"取反加 1" 是怎么来的
定义式里是
拆项之后一目了然:$1111111 - $ 数值位就是逐位取反(因为每一位不是 0 就是 1,用 1 减等于翻转),剩下那个
移码
即在真值上加一个偏置常数(这里取
表示范围:与补码相同,
移码的用处是便于比较大小:真值越大,移码作为无符号整数读出来的值也越大,顺序完全一致。所以浮点数的阶码采用移码,比较两个浮点数的大小时可以直接按位串比。
移码与 IEEE 754 的偏置常数
IEEE 754 的阶码同样是移码,只是偏置常数不取
不要把"移码最小真值对应全 0"与"IEEE 754 阶码全 0 有特殊含义"混为一谈——后者是标准对特殊值的编码约定(阶码全 0 表示
四位编码全表
把 4 位字长下的所有位串列全,四种编码的差异一眼可见:
| 真值 | 原码 | 反码 | 补码 | 移码 |
|---|---|---|---|---|
| +7 | 0111 | 0111 | 0111 | 1111 |
| +6 | 0110 | 0110 | 0110 | 1110 |
| +5 | 0101 | 0101 | 0101 | 1101 |
| +4 | 0100 | 0100 | 0100 | 1100 |
| +3 | 0011 | 0011 | 0011 | 1011 |
| +2 | 0010 | 0010 | 0010 | 1010 |
| +1 | 0001 | 0001 | 0001 | 1001 |
| +0 | 0000 | 0000 | 0000 | 1000 |
| −0 | 1000 | 1111 | — | — |
| −1 | 1001 | 1110 | 1111 | 0111 |
| −2 | 1010 | 1101 | 1110 | 0110 |
| −3 | 1011 | 1100 | 1101 | 0101 |
| −4 | 1100 | 1011 | 1100 | 0100 |
| −5 | 1101 | 1010 | 1011 | 0011 |
| −6 | 1110 | 1001 | 1010 | 0010 |
| −7 | 1111 | 1000 | 1001 | 0001 |
| −8 | — | — | 1000 | 0000 |
看最后两行:
四种编码对比
| 编码 | 负数怎么编 | 零 | 表示范围( | 主要用途 |
|---|---|---|---|---|
| 原码 | 符号位 1 + 绝对值 | 两个 | 乘除法的数值部分 | |
| 反码 | 原码数值位取反 | 两个 | 求补码的中间步骤 | |
| 补码 | 反码 + 1 | 唯一 | 整数的通用表示、加减运算 | |
| 移码 | 补码符号位取反 | 唯一 | 浮点数的阶码 |
边界值:最容易出选择题的地方
由此派生出三个必须分清的位串(以 8 位为例):
| 位串 | 按补码读 | 说明 |
|---|---|---|
10000000 | 补码最小值。它的相反数 | |
10000001 | 补码最小值加 1 | |
11111111 | 全 1。不是 |
两个陷阱
不是溢出。8 位补码范围是 , 是合法值,机器数 10000000。别一看到它就判溢出。- 给定编码必须说清位数。同一个真值在不同位数下机器数不同;题目不给字长,
这类边界题根本无法作答。
补码的按权展开:把符号位当成一个负权
前面的分段定义适合"给真值求编码"。反过来"给一串位求真值",用按权展开更快——只要把最高位的权取成负的:
也就是说,
8 位的具体形态:
用它验算前面那三个位串:
| 位串 | 展开 | 真值 |
|---|---|---|
10000000 | ||
10000001 | ||
11111111 |
一句话记法
符号位为 1 时,真值 =
这比"取反加一再添负号"快得多,尤其是位串里 1 很多的时候。
用它构造极值
有一类题不给具体数,只给"位的个数"限制,要你找出最大/最小值。按权展开是唯一顺手的工具。
例:由 3 个 1 和 5 个 0 组成的 8 位二进制补码,能表示的最小整数是多少?
解:
- 定符号位。要最小(最负),符号位必须是
1——符号位为 0 的都是非负数,一定比它大。用掉一个1。 - 写出展开式。符号位为 1
真值 。 - 最小化剩下的部分。低 7 位还剩 2 个
1和 5 个0,要让它作为无符号数尽可能小,就把两个1全塞到最低位:0000011。
干扰项各自错在哪,值得逐个看一眼——它们代表三种不同的走神方式:
| 干扰项 | 对应位串 | 问题 |
|---|---|---|
10000010 | 只有 2 个 1,不满足"3 个 1"的条件 | |
11111101 | 有 7 个 1,同样不满足 | |
11100000 | 1 的个数是对的(3 个),但它不是最小——两个 1 摆在高位,低 7 位读出来是 96, |
1 全塞到最低位"不是随手一放,而是最小化那一项的唯一方式。
典型例题
例 1:8 位(含符号位),写出
0101101。
| 编码 | 结果 | 怎么来的 |
|---|---|---|
| 原码 | 10101101 | 符号位 1 + 绝对值 |
| 反码 | 11010010 | 原码数值位取反 |
| 补码 | 11010011 | 反码加 1 |
| 移码 | 01010011 | 补码符号位取反 |
验证补码:
例 2:8 位补码能表示的最小负数与最大正数分别是多少?
最小 10000000),最大 01111111)。注意负边界的绝对值比正边界大 1,这是补码的固有不对称。
例 3:由 3 个 1 和 5 个 0 组成的 8 位补码,能表示的最小整数是多少?
要最小(最负),符号位必须是 1(占掉一个 1)。剩下 2 个 1 放在数值位——负数补码的数值位越小、真值越负,所以两个 1 尽量往低位放:10000011。
真值
考点清单
- [ ] 真值与机器数的区别:符号是否被编码进位串
- [ ] 四种编码的定义式与表示范围
- [ ] 零的表示:原码/反码各两个,补码/移码唯一
- [ ] 补码比原码/反码多表示一个
,因为省下了 的编码 - [ ] 补码能用加法做减法的原因是模运算;"取反加 1"是定义式
的展开 - [ ] 移码 = 补码符号位取反,用于阶码,因为它可直接按无符号比大小
- [ ] IEEE 754 阶码也是移码,但偏置常数取
- [ ] 边界辨析:
10000000=(合法非溢出)、 11111111= - [ ] 给定编码必须交代位数,否则边界题无解
真题练习
相关真题(20题)
教材出处
- 四种编码的定义式与表示范围:唐朔飞《计算机组成原理》第 3 版 §6.1 无符号数和有符号数,印刷页 p223–p228(含表 6.1 全位串对照表、图 6.1 移码数轴)
- 模运算动机与"取反加 1"的代数展开:袁春风《计算机组成与系统结构》第 3 版 §2.1.4 定点数的编码,印刷页 p29–p31