考研学习
知识点讲义计算机组成原理

第 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. 硬件容易实现:高/低电平正好表示 1/0;
  2. 和逻辑运算的真/假天然对应;
  3. 运算规则简单,容易构造数字逻辑电路。

二进制不是因为“数学上更高级”,而是因为物理实现最可靠、最简单。

三、任意进制数的本质

例如十进制:

123.45

其实代表:

二进制:

101.101

代表:

所以:

这就是所谓的按权展开。

四、进制转换必须熟练

1. 二进制 → 十进制

直接按权展开。

例如:

110101.01

2. 十进制整数 → 二进制

口诀:

除 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 个二进制位。

例如:

3AH
3 → 0011
A → 1010

所以:

这种题不要先转十进制,直接分组最快。

六、本章第一大核心:机器数

现实中写:

+5
-5

这个叫真值。

但是 CPU 只能存 0/1,所以连正负号也必须编码。

于是出现了:

  • 原码
  • 反码
  • 补码
  • 移码

资料把它们作为定点数编码的核心内容。

七、原码

原码最符合人类直觉:

最高位:符号
其余位:绝对值

例如 8 位:

+5 = 00000101
-5 = 10000101

优点

容易理解。

最大缺点

有两个 0:

+0 = 00000000
-0 = 10000000

而且做加减法非常麻烦。

例如:

5 + (-3)

硬件不能简单把两个比特串直接相加,要先:

  1. 判断符号;
  2. 判断绝对值大小;
  3. 决定加还是减;
  4. 决定结果符号。

所以现代整数计算基本不用原码做算术运算。资料也特别强调,现代机器普遍采用补码来简化硬件。

八、反码

正数反码 = 原码。

负数反码:

符号位不变,数值位按位取反。

例如 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 = 0

signed、unsigned 都有意义。

二十九、SF:Sign Flag

就是结果最高位。

对补码:

SF = 0 → 看起来是非负数
SF = 1 → 看起来是负数

但是注意:

如果发生 OF,SF 可能已经不能代表数学结果真正的正负。

三十、CF:Carry Flag

主要用于无符号运算。

加法时:

最高位产生进位 → CF = 1

例如 4 位:

1111 + 0001

得到:

1 0000

4 位只能保留:

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=1A=B
ZF=0 且 CF=0A>B
CF=1A<B

三十五、有符号数

因为 SF 可能受 OF 影响,所以不能只看 SF。

执行:

规则:

条件关系
ZF=1A=B
ZF=0 且 OF=SFA>B
ZF=0 且 OF≠SFA<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

每一轮:

  1. 看 Y 的最低位;
  2. 如果最低位为 1:
  1. 把相关寄存器整体右移;
  2. Y 的下一位成为新的最低位;
  3. 重复 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 真值

反过程:

  1. 拆 S;
  2. 拆 e;
  3. 拆 f;
  4. 算实际指数;
  5. 补回隐藏 1;
  6. 计算。

例如规格化单精度:

最后:

五十一、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

所以第一个输入:

10111011

38:

00100110

执行减法需要送入:

~y = 11011001

并且:

Cin = 1

所以输入:

10111011
11011001
Cin=1

这就是资料模拟题答案。

真正要掌握的不是这几个比特,而是:

减法硬件 = Y 取反 + 最低位进位设 1。

七十二、第 2 章最容易混淆的 12 个点

1. 最高位为 1 不一定就是负数

只有解释为有符号补码时才是。

无符号:

11111111 = 255

8 位补码:

11111111 = -1

2. CF ≠ OF

CF → unsigned
OF → signed

3. SF=1 不一定说明数学结果真的小于 0

如果 OF=1,符号位可能因溢出而错误。

4. 有符号比较不能只看 SF

要看:

5. 算术右移不是补 0

负数算术右移:

高位补 1。

6. 左移不一定等于乘 2

只有没有溢出时才成立。

7. 补码负数不是“符号位 + 绝对值”

这是原码思想。

8. 单精度尾数不是只有 23 位精度

规格化数有隐藏位,所以实际有效二进制位:

24 位

9. 最小正 float 不是:

那只是最小正规格化数。

最小正非零数是:

10. e=0 不能用普通规格化公式

此时:

0.f

而不是:

1.f

11. e 全 1 不一定是 infinity

f=0 → infinity
f≠0 → NaN

12. 浮点数范围大 ≠ 精度高

越大的数附近,可表示数之间的间隔也越来越大。

七十三、最后给你一套第 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 完全是两套溢出语义”这三件事理解透,它们是整章很多题目共同的底层逻辑。

On this page

一、第 2 章到底在研究什么?考试重要度二、数制与进制转换1. 为什么计算机偏偏使用二进制?三、任意进制数的本质四、进制转换必须熟练1. 二进制 → 十进制2. 十进制整数 → 二进制3. 十进制小数 → 二进制一个重要理解五、二、八、十六进制转换六、本章第一大核心:机器数七、原码优点最大缺点八、反码九、本章最重要的编码:补码求负数补码的最实用方法十、看到补码怎么快速求真值?更推荐的考试秒算公式十一、为什么补码如此重要?十二、补码为什么比原码多一个负数?十三、原码、反码、补码范围总表十四、移码十五、C 语言整数类型——统考超级高频十六、类型转换最重要的两个动作1. 长 → 短:截断为什么危险?十七、短 → 长:扩展无符号数有符号补码十八、signed ↔ unsigned:位模式可能完全不变十九、移位运算逻辑右移二十、算术右移二十一、左移二十二、算术左移什么时候溢出?二十三、加法器:CPU 为什么会算加法?二十四、串行进位为什么慢?二十五、ALU 是什么?二十六、本章最核心硬件思想:用一个加法器同时完成加法和减法二十七、为什么同一个电路既能算 signed 又能算 unsigned?二十八、四大标志位:必须熟练1. ZF:Zero Flag二十九、SF:Sign Flag三十、CF:Carry Flag减法时 CF 表示借位三十一、OF:Overflow Flag加法三十二、OF 的电路公式三十三、OF 和 CF 根本不是一回事三十四、有符号数和无符号数大小比较无符号数三十五、有符号数三十六、乘法:不要只背结果,要理解硬件为什么“加 + 移位”三十七、无符号迭代乘法器三十八、为什么 n 位 × n 位需要 2n 位结果?三十九、有符号乘法:Booth 算法四十、为什么 Booth 可以做有符号乘法?四十一、除法运算四十二、恢复余数法的核心过程第一步:整体左移第二步:试减四十三、除法异常要掌握四十四、本章另一座大山:浮点数四十五、阶码和尾数分别负责什么?四十六、IEEE 754 单精度结构——必背四十七、为什么明明只有 23 位尾数,却有 24 位有效数字?四十八、IEEE 754 双精度四十九、IEEE 754 实数 → 机器数:必会算法第一步:转二进制第二步:规格化第三步:算阶码字段第四步:存尾数五十、机器数 → IEEE 754 真值五十一、IEEE 754 最容易错的地方:e=0 和 e=全 1五十二、IEEE 754 特殊值总表阶码全 0,尾数全 0阶码全 0,尾数非 0五十三、最小正规格化数 vs 最小正数五十四、阶码全 1,尾数全 0五十五、阶码全 1,尾数非 0五十六、IEEE 754 表示范围单精度双精度五十七、浮点数真正的难点:加减法五十八、第一步:对阶五十九、为什么一定“小阶向大阶看齐”?六十、对阶的真正代价:小数可能直接“消失”六十一、为什么单精度阶码差达到 25 可以直接忽略小数?六十二、第二步:尾数加减六十三、第三步:规格化情况 1:结果太大 → 右规六十四、情况 2:结果太小 → 左规六十五、第四步:舍入六十六、第五步:浮点溢出六十七、上溢和下溢上溢下溢六十八、定点数和浮点数到底谁更好?定点数浮点数六十九、把整数和浮点数统一理解定点整数浮点数七十、典型题 1:补码 + 移位 + 溢出七十一、典型题 2:硬件减法器输入什么?七十二、第 2 章最容易混淆的 12 个点1. 最高位为 1 不一定就是负数2. CF ≠ OF3. SF=1 不一定说明数学结果真的小于 04. 有符号比较不能只看 SF5. 算术右移不是补 06. 左移不一定等于乘 27. 补码负数不是“符号位 + 绝对值”8. 单精度尾数不是只有 23 位精度9. 最小正 float 不是:10. e=0 不能用普通规格化公式11. e 全 1 不一定是 infinity12. 浮点数范围大 ≠ 精度高七十三、最后给你一套第 2 章做题流程七十四、考前真正要背下来的内容