第 2 章 数据的表示和运算
408 计算机组成原理第 2 章 数据的表示和运算复习讲义,涵盖核心概念、重点考点与典型题型。
Last updated on
一、第 2 章到底在研究什么?
这一章本质上在回答三个问题:
一个数怎么变成 0/1?CPU 又怎么拿这些 0/1 做加减乘除?运算结果怎么判断对不对?
可以把整章压缩成:
现实中的数
↓
二进制表示
↓
原码 / 反码 / 补码 / 移码
↓
整数、浮点数
↓
ALU
↓
加减、移位、乘除
↓
OF / CF / SF / ZF
↓
IEEE 754 浮点运算考试重要度
| 内容 | 重要度 | 典型考法 |
|---|---|---|
| 补码、表示范围 | ★★★★★ | 机器数求真值、真值求机器数 |
| C 整型与类型转换 | ★★★★★ | 截断、符号扩展、unsigned |
| 补码加减、OF/CF/SF/ZF | ★★★★★ | 给机器数求标志位、判断大小 |
| IEEE 754 | ★★★★★ | 编码转换、范围、特殊值 |
| 浮点加减 | ★★★★★ | 对阶、规格化、舍入、溢出 |
| 移位 | ★★★★☆ | 算术/逻辑移位、溢出 |
| 加法器与 ALU | ★★★★☆ | 电路原理、进位 |
| 乘法器/除法器 | ★★★★☆ | 加移位过程、硬件结构 |
| 原码、反码、移码 | ★★★☆☆ | 概念与范围 |
| 进制转换 | ★★★☆☆ | 基础选择题 |
二、数制与进制转换
1. 为什么计算机偏偏使用二进制?
资料给出的核心原因有三个:
- 硬件容易实现:高/低电平正好表示 1/0;
- 和逻辑运算的真/假天然对应;
- 运算规则简单,容易构造数字逻辑电路。
二进制不是因为“数学上更高级”,而是因为物理实现最可靠、最简单。
三、任意进制数的本质
例如十进制:
123.45其实代表:
二进制:
101.101代表:
所以:
这就是所谓的按权展开。
四、进制转换必须熟练
1. 二进制 → 十进制
直接按权展开。
例如:
110101.012. 十进制整数 → 二进制
口诀:
除 2 取余,逆序排列。
例如 13:
13 ÷ 2 = 6 ...1
6 ÷ 2 = 3 ...0
3 ÷ 2 = 1 ...1
1 ÷ 2 = 0 ...1逆着读:
3. 十进制小数 → 二进制
口诀:
乘 2 取整,顺序排列。
例如 0.625:
0.625 × 2 = 1.25 → 1
0.25 × 2 = 0.5 → 0
0.5 × 2 = 1.0 → 1所以:
一个重要理解
有些十进制小数无法用有限二进制精确表示,例如:
0.1就类似于十进制无法有限表示:
这也是为什么:
float x = 0.1;通常存进去的并不是数学意义上精确的 0.1。
这为后面的 IEEE 754 埋下伏笔。
五、二、八、十六进制转换
这是最简单的一类。
因为:
所以一个八进制位对应 3 个二进制位。
而:
所以一个十六进制位对应 4 个二进制位。
例如:
3AH3 → 0011
A → 1010所以:
这种题不要先转十进制,直接分组最快。
六、本章第一大核心:机器数
现实中写:
+5
-5这个叫真值。
但是 CPU 只能存 0/1,所以连正负号也必须编码。
于是出现了:
- 原码
- 反码
- 补码
- 移码
资料把它们作为定点数编码的核心内容。
七、原码
原码最符合人类直觉:
最高位:符号
其余位:绝对值例如 8 位:
+5 = 00000101
-5 = 10000101优点
容易理解。
最大缺点
有两个 0:
+0 = 00000000
-0 = 10000000而且做加减法非常麻烦。
例如:
5 + (-3)硬件不能简单把两个比特串直接相加,要先:
- 判断符号;
- 判断绝对值大小;
- 决定加还是减;
- 决定结果符号。
所以现代整数计算基本不用原码做算术运算。资料也特别强调,现代机器普遍采用补码来简化硬件。
八、反码
正数反码 = 原码。
负数反码:
符号位不变,数值位按位取反。
例如 8 位:
+5 原码 = 00000101
+5 反码 = 00000101
-5 原码 = 10000101
-5 反码 = 11111010仍然存在:
+0
-0所以并没有彻底解决问题。
九、本章最重要的编码:补码
现代有符号整数基本都采用补码。
求负数补码的最实用方法
绝对值写成二进制 → 全部取反 → 加 1
例如求 -5 的 8 位补码。
+5:
00000101取反:
11111010加 1:
11111011因此:
-5 → 11111011十、看到补码怎么快速求真值?
假设看到:
11111011最高位 1,说明是负数。
方法一:再次“取反加 1”:
11111011
取反
00000100
+1
00000101所以真值是:
更推荐的考试秒算公式
一个 n 位补码比特串,如果最高位是 1,把整个比特串当无符号整数得到 U,那么:
例如:
DCH = 11011100看作无符号数:
8 位补码:
资料中的模拟题就直接用了这种方法。
这个公式强烈建议记住。
十一、为什么补码如此重要?
这是这一章最应该真正理解的地方。
假设 4 位机器算:
3 的补码:
0011-2:
1110直接相加:
0011
+ 1110
------
1 0001只保留低 4 位:
0001就是 1。
也就是说:
使用补码以后,减法器都可以不要,减法可以转换成加法。
数学本质就是模运算。
对于 n 位机器:
这才是补码真正强大的地方。
十二、补码为什么比原码多一个负数?
假设总字长为 n 位。
无符号整数范围:
有符号补码范围:
例如 8 位:
注意:
10000000在 8 位补码中不是“-0”,而是:
因此补码只有一个 0,并多表示一个最小负数。
十三、原码、反码、补码范围总表
若机器一共 n 位:
| 编码 | 范围 | 0 |
|---|---|---|
| 原码 | 负最大到正最大 | +0/-0 |
| 反码 | 负最大到正最大 | +0/-0 |
| 补码 | 最小负数到最大正数 | 唯一 |
补码:
原码、反码:
十四、移码
移码主要服务于浮点数阶码。
基本思想是:
给真实指数加一个固定偏置 Bias,使所有指数都变成非负二进制数。
如果一个指数真值是 E:
为什么这么干?
因为浮点数经常需要比较指数大小。
例如:
-20
-3
5
20如果直接用补码,二进制大小关系不是简单的无符号大小关系。
加 Bias 后:
更小指数 → 更小编码
更大指数 → 更大编码于是比较阶码可以直接使用无符号比较电路。
十五、C 语言整数类型——统考超级高频
资料明确把 unsigned、short、int、long 的表示范围和类型转换列为重点。
常见考试环境:
char 8 bit
short 16 bit
int 32 bit具体题目仍以题设为准。
十六、类型转换最重要的两个动作
只有两个:
变短:截断
变长:扩展
1. 长 → 短:截断
例如:
32 位 int
↓
16 位 short直接保留低 16 位。
高位全部扔掉。
例如:
0000 0000 0000 0001 0010 0011 0100 0101转为 16 位:
0010 0011 0100 0101为什么危险?
因为数值可能完全变化。
这类题不能“先看十进制再凭感觉转换”,一定要:
写机器数 → 截位 → 按目标类型重新解释。
十七、短 → 长:扩展
分两类。
无符号数
使用零扩展:
10110101扩展成 16 位:
00000000 10110101有符号补码
使用符号扩展:
最高位是什么,就在前面补什么。
例如 8 位:
11111011表示 -5。
扩展成 16 位:
11111111 11111011仍然表示 -5。
这就是符号扩展。
资料将零扩展和符号扩展列为 2012、2021、2024 等年份出现过的重点。
十八、signed ↔ unsigned:位模式可能完全不变
假设 32 位:
int x = -1;
unsigned int y = x;机器中 -1 的补码:
11111111 11111111 11111111 11111111转换为 unsigned 后:
位模式不变,只是解释方式变了。
于是:
所以 signed/unsigned 混合运算是 408 很喜欢设陷阱的地方。
十九、移位运算
资料中逻辑移位考过 2018,算术移位在 2012、2017、2018 等年份出现。
最重要的区别:
逻辑右移
把数看成无符号数:
右移 → 高位补 0例如:
10110000逻辑右移:
01011000二十、算术右移
把数看成补码有符号数。
原则:
高位补符号位。
例如:
11110000符号位为 1。
算术右移:
11111000而不是:
01111000这样才能保持负数性质。
二十一、左移
逻辑左移和补码算术左移的位操作形式基本一样:
高位丢弃
低位补 0如果没有溢出,左移一位约等于:
右移一位约等于:
但注意“约等于”,因为可能:
- 溢出;
- 丢低位;
- 舍入方向发生变化。
二十二、算术左移什么时候溢出?
这是模拟题中的典型题。
4 位补码:
x1 x2 x3 x4左移:
x2 x3 x4 0原符号位是 x1。
新符号位是 x2。
因此:
就发生溢出。
例如:
0110表示 +6。
左移:
1100被解释为负数,显然:
已经超出 4 位补码范围:
所以发生溢出。
二十三、加法器:CPU 为什么会算加法?
一个加法器最基本的单元是全加器。
第 i 位输入:
Ai
Bi
Ci其中 Ci 是低位传来的进位。
输出:
Si
Ci+1和位:
进位:
多个全加器串起来,就构成多位加法器。
二十四、串行进位为什么慢?
例如:
第 0 位产生 C1
↓
第 1 位才能算 C2
↓
第 2 位才能算 C3
↓
...最高位必须等前面所有进位。
这叫串行进位加法器。
位数越多,延迟越大。
因此又出现:
先行进位加法器 CLA
它利用组合逻辑提前并行计算各级进位。
优点:
快代价:
电路复杂资料同样强调了 CLA 相比串行进位方式通过并行生成进位提升性能。
二十五、ALU 是什么?
ALU:
Arithmetic Logic Unit,算术逻辑单元。
它并不是“只会加法”。
它可以完成:
ADD
SUB
AND
OR
NOT
XOR
比较
移位
……乘除也常通过 ALU 的:
加/减 + 移位 + 控制器循环实现。
如果 ALUop 有 m 位,理论上最多能编码:
种操作。
二十六、本章最核心硬件思想:用一个加法器同时完成加法和减法
补码有:
而:
因此:
所以只要设计:
┌──── Y
Y ───────── MUX
└──── ~Y
│
X ─────────────────┤
↓
加法器加法:
Sub = 0
Y 不取反
Cin = 0于是:
减法:
Sub = 1
Y 取反
Cin = 1于是:
这就是:
一个加法器,一套硬件,同时支持 signed / unsigned 加减。
资料将补码加法器实现原理列为真题考点。
二十七、为什么同一个电路既能算 signed 又能算 unsigned?
因为电路本身根本不知道:
11111111代表什么。
你说它是无符号:
你说它是 8 位补码:
ALU 做的都只是比特运算。
所以:
硬件结果比特可能完全相同,但有符号与无符号的“溢出解释”不同。
这是第 2 章非常重要的思想。
二十八、四大标志位:必须熟练
CPU 加减完成后,不只有结果,还产生:
ZF
SF
OF
CF资料将各标志位分析列为 2011、2018、2022~2024 的高频考点。
1. ZF:Zero Flag
结果是不是 0。
结果 = 0 → ZF = 1
否则 ZF = 0signed、unsigned 都有意义。
二十九、SF:Sign Flag
就是结果最高位。
对补码:
SF = 0 → 看起来是非负数
SF = 1 → 看起来是负数但是注意:
如果发生 OF,SF 可能已经不能代表数学结果真正的正负。
三十、CF:Carry Flag
主要用于无符号运算。
加法时:
最高位产生进位 → CF = 1例如 4 位:
1111 + 0001得到:
1 00004 位只能保留:
0000发生 unsigned 溢出。
减法时 CF 表示借位
资料采用:
因此:
- 加法时,CF 就是最高位进位;
- 减法时,CF=1 表示发生借位。
例如无符号:
3 - 5数学结果:
但 unsigned 根本没有负数,因此发生借位:
CF = 1三十一、OF:Overflow Flag
这是最重要、也最容易和 CF 混淆的。
OF 专门判断有符号数溢出。
最经典判断:
加法
两个同号数相加,结果却变号 → 溢出。
例如 8 位:
但 8 位补码最大只有:
所以结果机器数可能变成负数。
即:
正 + 正 → 负OF=1。
类似:
负 + 负 → 正也一定溢出。
三十二、OF 的电路公式
设进入符号位的进位是:
C(n-1)符号位产生的最高进位:
Cn则:
即:
两个进位不同 → 有符号溢出。
这是一定要记的公式。
三十三、OF 和 CF 根本不是一回事
这是最常错的。
| 标志 | 判断什么 |
|---|---|
| OF | 有符号溢出 |
| CF | 无符号进位/借位 |
因此同一个运算:
可能 OF=1, CF=0
可能 OF=0, CF=1
可能都 0
可能都 1不能互相替代。
三十四、有符号数和无符号数大小比较
这也是标志位题的升级版。
执行:
无符号数
看:
ZF、CF规则:
| 条件 | 关系 |
|---|---|
| ZF=1 | A=B |
| ZF=0 且 CF=0 | A>B |
| CF=1 | A<B |
三十五、有符号数
因为 SF 可能受 OF 影响,所以不能只看 SF。
执行:
规则:
| 条件 | 关系 |
|---|---|
| ZF=1 | A=B |
| ZF=0 且 OF=SF | A>B |
| ZF=0 且 OF≠SF | A<B |
等价写成:
说明大于。
说明小于。
这个结论建议直接记住。
三十六、乘法:不要只背结果,要理解硬件为什么“加 + 移位”
十进制手算:
13
× 11
-----
13
130
-----
143二进制完全一样。
如果:
Y = y3 y2 y1 y0那么:
因为每个 yi 只有 0 或 1:
yi = 0 → 不加 X
yi = 1 → 加 X所以乘法可以变成:
检查乘数最低位 → 决定加不加 → 移位 → 重复。
资料中乘法原理在 2020、2024 被考查过。
三十七、无符号迭代乘法器
核心寄存器:
X:被乘数
Y:乘数
P:部分积
计数器初始化:
P = 0每一轮:
- 看
Y的最低位; - 如果最低位为 1:
- 把相关寄存器整体右移;
Y的下一位成为新的最低位;- 重复
n次。
最终:
P + Y组合起来形成 2n 位完整乘积。
资料中的 32 位乘法器也是按照这个控制流程实现的。
三十八、为什么 n 位 × n 位需要 2n 位结果?
最大无符号数:
两者相乘:
大约:
因此最多需要约 2n 位。
例如:
8 位 × 8 位完整结果最多需要:
16 位如果 CPU 只保留低 8 位,就有可能发生截断溢出。
三十九、有符号乘法:Booth 算法
Booth 不需要把复杂数学推导背下来。
资料明确说:
Booth 的数学推导较复杂,通常不是考研重点,重点掌握实现结构和过程。
核心多一个:
y(-1)初始化为:
0每次看:
y0 y(-1)规则:
| 两位 | 操作 |
|---|---|
| 00 | 不操作 |
| 11 | 不操作 |
| 01 | 加 X |
| 10 | 减 X |
然后:
整体算术右移 1 位
重复 n 次。
这四个规则值得记。
四十、为什么 Booth 可以做有符号乘法?
可以简单理解为:
Booth 不逐个统计连续的 1,而是寻找:
0 → 1
1 → 0这样的边界。
连续一串 1:
00111100不必:
+X
+2X
+4X
+8X而可以利用:
某个更高次幂 - 某个低次幂所以有:
01 → 加
10 → 减这就是 Booth 的直觉。
四十一、除法运算
二进制除法的基本思想与十进制竖式仍然一样:
移位 → 试减 → 判断够不够减 → 确定一个商位。
资料在 2025 的考点追踪中特别标出了除法异常处理。
四十二、恢复余数法的核心过程
主要寄存器:
Y:除数
R:余数
Q:被除数 / 最终商初始化:
R = 0
Q = 被除数每轮:
第一步:整体左移
把:
R | Q视为一个整体左移。
相当于手算竖式中的:
“再落下一位”。
第二步:试减
计算:
如果:
说明够减:
R = R-Y
商位 = 1如果:
说明不够减:
商位 = 0然后:
恢复原来的余数。
因此称:
恢复余数法。
重复 n 次得到商和余数。资料中的硬件除法器也是这个流程。
四十三、除法异常要掌握
最明显的是:
除数为 0,触发异常。
对于两个 n 位无符号整数:
正常除法不会发生商溢出。
但是补码有一个著名特例:
而 n 位补码最大只能表示:
因此发生商溢出。
例如 32 位:
INT_MIN / -1就是经典特殊情况。
四十四、本章另一座大山:浮点数
为什么需要浮点数?
假设只有定点整数 32 位:
范围固定如果我们想表示:
0.000000000001和:
100000000000就非常困难。
于是引入类似科学计数法:
二进制同理:
其中:
S:符号
M:尾数
E:阶码资料也使用这一统一模型描述浮点数。
四十五、阶码和尾数分别负责什么?
这句话非常重要:
阶码决定范围,尾数决定精度。
阶码越多:
指数可以更大或更小
→ 数值范围更广尾数越多:
保留的有效二进制位越多
→ 精度越高四十六、IEEE 754 单精度结构——必背
float 常用单精度:
32 bit分成:
1 bit 符号 S
8 bit 阶码 e
23 bit 尾数 f即:
S | eeeeeeee | fffffffffffffffffffffff规格化数真实值:
偏置:
四十七、为什么明明只有 23 位尾数,却有 24 位有效数字?
因为规格化二进制数一定是:
1.xxxxxxxx × 2^E最前面的:
1永远是 1。
既然永远知道是 1,就没有必要存。
例如:
真正存:
101011...前面的 1 称:
隐藏位 / 隐含位。
因此:
23 位显式尾数
+ 1 位隐藏 1
= 24 位有效精度这也是为什么单精度对阶相关题经常出现 24、25。
四十八、IEEE 754 双精度
double:
64 bit结构:
1 bit 符号
11 bit 阶码
52 bit 尾数偏置:
规格化数:
所以实际有效位:
52 + 隐藏 1 = 53 位四十九、IEEE 754 实数 → 机器数:必会算法
资料指出这类转换在 2011、2013、2020、2022、2023、2025 等多次出现。
例如资料中的:
第一步:转二进制
所以:
第二步:规格化
因此:
S = 1
E = 3第三步:算阶码字段
130 的二进制:
10000010第四步:存尾数
真实有效数:
1.00001隐藏第一个 1:
f = 00001...补到 23 位。
所以:
1 | 10000010 | 00001000000000000000000最终:
C1040000H这正是资料例题的结果。
五十、机器数 → IEEE 754 真值
反过程:
- 拆 S;
- 拆 e;
- 拆 f;
- 算实际指数;
- 补回隐藏 1;
- 计算。
例如规格化单精度:
最后:
五十一、IEEE 754 最容易错的地方:e=0 和 e=全 1
并不是所有 IEEE 754 数都使用:
只有:
1 ≤ e ≤ 254的单精度数才是普通规格化数。
资料把特殊值考点追踪到了 2017、2023。
五十二、IEEE 754 特殊值总表
阶码全 0,尾数全 0
S=0 → +0
S=1 → -0阶码全 0,尾数非 0
非规格化数
此时没有隐藏的 1。
有效数变成:
0.f单精度:
它存在的目的:
填补 0 和最小规格化数之间的巨大空洞。
五十三、最小正规格化数 vs 最小正数
超级容易混。
单精度最小正规格化数:
但是最小正非零数:
尾数最低一位是 1:
即:
模拟题专门考过这个区别。
五十四、阶码全 1,尾数全 0
表示:
+∞
-∞例如某些浮点运算溢出后,可以得到 infinity,而不是立即让整个程序停止。
五十五、阶码全 1,尾数非 0
表示:
NaN
Not a Number。
例如一些未定义运算可能产生 NaN。
所以牢记:
e 全 1
f = 0 → infinity
f ≠ 0 → NaN而:
e 全 0
f = 0 → ±0
f ≠ 0 → 非规格化数这一组建议直接背成四格表。
五十六、IEEE 754 表示范围
单精度
最小正规格化正数:
最大正规格化数:
最小正非规格化数:
双精度
最小正规格化正数:
最大正规格化数:
最小正非规格化数:
资料把浮点表示范围和有效位列为 2017、2018、2024 的考点。
五十七、浮点数真正的难点:加减法
浮点加减绝对不能直接:
尾数 + 尾数因为小数点位置可能不同。
完整流程必须记成五步:
对阶 → 尾数加减 → 规格化 → 舍入 → 判断溢出
这是第 2 章最重要的算法流程之一。
五十八、第一步:对阶
例如:
和:
不能直接加尾数。
必须使阶码一致。
原则:
小阶向大阶看齐。
所以第二个数:
改成:
然后:
五十九、为什么一定“小阶向大阶看齐”?
因为小阶数尾数是右移。
右移损失的是低有效位。
如果反过来大阶向小阶:
大数尾数左移可能直接把最高有效位挤出去。
这会造成不可恢复的信息损失。
因此固定原则:
小阶右移,大阶不动。
六十、对阶的真正代价:小数可能直接“消失”
例如:
加:
第二个数对阶需要右移 100 位。
尾数精度只有有限几十位。
于是它最后可能全部被移出去。
CPU 最终认为:
这不是 bug。
这是:
有限精度浮点数的必然结果。
六十一、为什么单精度阶码差达到 25 可以直接忽略小数?
资料的模拟题明确给出:
如果采用 IEEE 754 单精度,并使用就近舍入,阶差满足:
则较小的数已经不足以影响最终结果,可以直接取阶大的那个数。
原因:
单精度有效位一共:
24 位当小数再右移至少 25 位,就落到半个最低有效位以下,无法改变最终就近舍入结果。
这是一道非常典型的“理解精度”题。
六十二、第二步:尾数加减
完成对阶后:
指数一样就可以对尾数进行加减。
例如:
得到:
如果异号,则实际上执行尾数减法。
六十三、第三步:规格化
浮点结果希望保持:
1.xxxxx × 2^E所以尾数加减以后可能需要调整。
主要有两类。
情况 1:结果太大 → 右规
例如:
得到:
11.01 × 2^E不符合规格化要求。
变成:
所以:
右规:尾数右移 1 位,阶码 +1。
六十四、情况 2:结果太小 → 左规
例如:
必须变:
所以:
左规一次:尾数左移一位,阶码减一。
可能需要连续左规多次。
这也是为什么两个很接近的浮点数相减容易损失大量有效数字。
六十五、第四步:舍入
硬件内部通常会临时保留更多位。
最终存回 float 时只有固定 23 位尾数字段,因此多出来的位必须舍弃。
资料介绍的舍入思想包括:
- 就近舍入;
- 朝正无穷舍入;
- 朝负无穷舍入;
- 朝 0 舍入。
408 最常见的是:
就近舍入。
真正理解:
不是简单“最后一位 1 就进位”。
还要考虑:
被舍弃部分距离哪一个可表示浮点数更近六十六、第五步:浮点溢出
浮点溢出看什么?
不是单纯看尾数。
真正决定是否溢出的是:
阶码。
因为尾数过大时通常可以右规:
10.xxxx
↓
1.0xxxx × 2^(E+1)所以只要指数还能 +1,就还能表示。
只有:
阶码已经没有位置可加才是真正上溢。
资料将浮点溢出判断列为 2015 的考点。
六十七、上溢和下溢
上溢
结果绝对值太大。
IEEE 754 通常得到:
+∞
-∞并设置相应异常状态。
下溢
结果非常接近 0。
不是一进入:
就马上变成 0。
IEEE 754 有非规格化数,所以可以继续表示:
下面的数。
直到比:
还要小,才无法用单精度非零值表示。
这叫:
渐进下溢。
六十八、定点数和浮点数到底谁更好?
不是简单的“浮点更高级”。
同样 n 位。
定点数
优点:
相邻数间距比较规则
精确整数范围内通常完全精确
运算简单缺点:
范围小浮点数
优点:
范围极大缺点:
精度不均匀
很多实数不能精确表示
运算存在舍入误差而且一个非常容易错的说法:
“浮点数位数相同时能表示更多数。”
并不正确。
n 位编码总共最多只有:
种比特模式。
浮点数只是把这些有限编码更稀疏地铺在一个巨大数轴范围上。
资料本章小结也特别指出,位数相同时浮点数并不会拥有更多编码,部分编码还用于 ±0、NaN 等特殊值。
六十九、把整数和浮点数统一理解
这能帮你真正理解整个第 2 章。
定点整数
比如 8 位:
00000101每一位权值固定:
128 64 32 16 8 4 2 1小数点永远固定。
浮点数
例如:
S | E | M尾数本身只有固定若干位。
但指数 E 控制:
整个尾数的小数点实际放在哪里。
所以叫:
浮点。
“小数点会随着指数浮动”。
七十、典型题 1:补码 + 移位 + 溢出
资料中的一道模拟题给:
[x]补 = 44H
[y]补 = DCH求:
先求真值:
44H = 01000100 → +68所以:
DCH:
11011100按 8 位补码:
因此:
-38 的 8 位补码:
即:
DAH因为:
所以:
OF = 0资料对应答案就是 DAH、0。
这道题实际上一次考了:
- 补码解析;
- 算术右移;
- 左移乘 2;
- 补码编码;
- OF。
七十一、典型题 2:硬件减法器输入什么?
资料模拟题:
x = -69
y = 38求 CPU 执行:
加减器不会真的调用一个“减法器”。
而是:
-69:
69 = 01000101取反加一:
10111011所以第一个输入:
1011101138:
00100110执行减法需要送入:
~y = 11011001并且:
Cin = 1所以输入:
10111011
11011001
Cin=1这就是资料模拟题答案。
真正要掌握的不是这几个比特,而是:
减法硬件 = Y 取反 + 最低位进位设 1。
七十二、第 2 章最容易混淆的 12 个点
1. 最高位为 1 不一定就是负数
只有解释为有符号补码时才是。
无符号:
11111111 = 2558 位补码:
11111111 = -12. CF ≠ OF
CF → unsigned
OF → signed3. SF=1 不一定说明数学结果真的小于 0
如果 OF=1,符号位可能因溢出而错误。
4. 有符号比较不能只看 SF
要看:
5. 算术右移不是补 0
负数算术右移:
高位补 1。
6. 左移不一定等于乘 2
只有没有溢出时才成立。
7. 补码负数不是“符号位 + 绝对值”
这是原码思想。
8. 单精度尾数不是只有 23 位精度
规格化数有隐藏位,所以实际有效二进制位:
24 位9. 最小正 float 不是:
那只是最小正规格化数。
最小正非零数是:
10. e=0 不能用普通规格化公式
此时:
0.f而不是:
1.f11. e 全 1 不一定是 infinity
f=0 → infinity
f≠0 → NaN12. 浮点数范围大 ≠ 精度高
越大的数附近,可表示数之间的间隔也越来越大。
七十三、最后给你一套第 2 章做题流程
以后遇到整数机器数题,按照:
① 明确字长
↓
② 明确 signed / unsigned
↓
③ 写二进制位模式
↓
④ 判断是否截断/扩展
↓
⑤ 按位执行加减/移位
↓
⑥ 只保留规定字长
↓
⑦ 最后再解释真值
↓
⑧ 分别求 OF、CF、SF、ZF最大的原则:
先处理“机器中的比特”,最后再解释成数学数值。
不要一直用十进制凭感觉算。
浮点题固定流程:
十进制
↓
二进制
↓
规格化 1.f × 2^E
↓
S
↓
e = E + Bias
↓
去掉隐藏位得到 f浮点加减:
① 对阶
小阶向大阶
② 尾数加减
③ 规格化
右规 → 阶码 +1
左规 → 阶码 -1
④ 舍入
⑤ 检查阶码溢出七十四、考前真正要背下来的内容
如果最后复习时间很紧,第 2 章至少把这些牢牢记住:
负数补码:
取反 + 1补码快速求真值:
减法:
有符号溢出:
无符号进/借位:
有符号比较:
单精度:
1 + 8 + 23
Bias = 127双精度:
1 + 11 + 52
Bias = 1023单精度:
IEEE 特殊编码:
e=0, f=0 → ±0
e=0, f≠0 → 非规格化
e=全1, f=0 → ±∞
e=全1, f≠0 → NaN浮点加减:
小阶向大阶对齐 → 尾数加减 → 规格化 → 舍入 → 判断阶码溢出。
如果把上面这些内容真正吃透,第 2 章绝大部分统考选择题就已经有稳定的解题框架了;尤其要把“同一个二进制串,signed/unsigned 是两种解释”“同一个加法器完成 signed/unsigned 加减”“OF 与 CF 完全是两套溢出语义”这三件事理解透,它们是整章很多题目共同的底层逻辑。