模块一:数据表示与运算(补码、移码、无符号数)
- 基础概念与数学表达
· 补码(Two's Complement):计算机内部存储整数的方式。正数与原码相同,负数通过“按位取反,末位加一”求得。
· 移码(Offset Binary):常用于浮点数阶码。与补码的关系是符号位取反,数值位不变。
· 🔥易错点:移码没有正负零之分,且移码的大小顺序与无符号数一致,这保证了浮点数的比较可以直接按整数比较。
· 偏置值为 2^{n-1} 时:[x]_{移} = x + 2^{n-1} \quad (x \in [-2^{n-1}, 2^{n-1}-1])
· 偏置值为 2^{n-1}-1 时:[x]_{移} = x + (2^{n-1}-1)
- 🔥 痛点突破:为什么补码和真值关系不如原码直观?
· 原码是“所见即所得”(符号位+绝对值,人类直觉,但机器运算复杂)。
· 补码是“所算即所得”(同余运算,机器直接当无符号数加,高位进位丢弃,硬件极简)。代价是违背人类直觉。
· 示例:真值 -5 的 8 位表示:
· 原码:1000\ 0101 (直观)
· 补码:1111\ 1011 (不直观,需大脑执行“取反加一”逆运算)
- 🔥 极值求解考题复盘(8位二进制,2个“0”和6个“1”)
· 无符号数范围:0011\ 1111_2 = 63 至 1111\ 1100_2 = 252。
· 求补码最小值:最高位(符号位)必须为 1(负数)。剩下7位分配2个 0 和5个 1。为了让负数值最小(绝对值最大),数值位应尽可能小,即放 0000011_2 = 3。
· 公式:最小值 = -128 + 3 = -125
· 求补码最大值:最高位必须为 0(正数)。剩下7位分配1个 0 和6个 1。为了让正数值最大,数值位的 1 应尽量靠左(权值大),即放 1111110_2 = 126。
· 公式:最大值 = 0 + 126 = 126
· 求移码最值:移码不改变无符号数的大小顺序。直接拿无符号数的最值减去偏置值即可。
· 偏置127:63 - 127 = -64(最小);252 - 127 = 125(最大)
· 偏置128:63 - 128 = -65(最小);252 - 128 = 124(最大,注意干扰项写的是123)
- 🔥 C语言类型转换(无符号转有符号)复盘
· 例题:unsigned short usi = 65535; short si = usi; 求 si 的真值。
· 底层逻辑:位模式原封不动拷贝(都是 1111\ 1111\ 1111\ 1111)。
· 解释权变更:无符号数看全是数值;有符号数看最高位是符号位。最高位 1 代表负数。
· 求真值(补码转原码):符号位不变,数值位按位取反再加1,得到 1000\ 0000\ 0000\ 0001,即 -1。
· 速记:全 1 的补码,真值就是 -1。
- 补码减法与溢出判断
· 基本公式:[A - B]_{补} = [A]_{补} + [-B]_{补}
· 求 [-B]_{补} 的方法:将 [B]_{补} 连同符号位一起按位取反,末位加 1。
· 溢出判断:
· 方法一:数学结果是否超出 [-128, 127](8位情况)。
· 方法二:两个同符号数相加,若结果符号与原符号相反,则发生溢出。(正+正=负,或 负+负=正 均为溢出)。
· 运算规则:最高位产生的进位 1 必须丢弃,只保留低8位。
模块二:CPU 性能指标
- 核心公式与关系表达
· 主频与时钟周期:T = \frac{1}{f} (单位:秒 s)
· CPI(执行一条指令所需的平均时钟周期数):
CPI = \frac{\text{程序总时钟周期数}}{\text{程序总指令数}} = \sum_{i=1}^{n} (CPI_i \times \text{指令比例}_i)
· IPC(每周期执行的指令数):IPC = \frac{1}{CPI}
· MIPS(每秒百万条指令):
MIPS = \frac{\text{指令总数}}{\text{执行时间} \times 10^6} = \frac{f}{CPI \times 10^6}
· 平均指令周期(时间):
\text{平均指令周期}(\mu s) = \frac{\text{执行时间}}{\text{指令总数}} = \frac{1}{MIPS}
· CPU 执行时间:
CPU执行时间 = \text{指令总数} \times CPI \times T = \frac{\text{指令总数}}{MIPS \times 10^6}
- 🔥 痛点突破:真题中“增加新指令”为什么总指令数变了?
· 原文陷阱:“增加一种新指令”实为“替换”。
· 逻辑:编译器优化时,将原有的 [LOAD指令 + 算术逻辑指令] 合并替换成了 [1条新指令]。
· 后果:程序逻辑不变,但总指令条数绝对减少了!所以不能拿 M 作为新分母,必须计算出新的总指令数 M',再去求各指令的新比例。
· 公式:新总指令数 M' = M - (\text{被替换的指令数量})。
· 计算新比例时:\text{新指令比例} = \frac{\text{新指令数量}}{M'}。
- 单位换算避坑指南
· 1s = 10^3 ms = 10^6 \mu s = 10^9 ns
· MIPS 公式中的 10^6 是因为 MIPS 是“百万条/秒”。如果给出的是 Hz(如 2GHz = 2 \times 10^9 Hz),直接代入 f 就行。
模块三:易混淆概念对比表
易混淆概念 本质区别 公式或关系
CPI vs IPC CPI 是“做一件事要几个周期”;IPC 是“一个周期能做几件事” IPC = \frac{1}{CPI}
平均指令周期 vs CPU执行时间 前者是单条指令平均耗时;后者是整个程序总耗时 CPU执行时间 = 总指令数 \times 平均指令周期
平均指令周期(周期数) vs 平均指令周期(时间) 前者带单位“周期/条”,就是 CPI;后者带单位“秒/条” 时间 = CPI \times T
原码 vs 补码 原码直观但计算复杂;补码计算简单但人类不直观 正数补码=原码;负数补码=反码+1
无符号数转有符号数 内存二进制位不变,仅仅改变了解释方式 最高位为1时,数值 = 无符号值 - 2^n
模块四:针对性复盘练习题(附解析)
题目1(数据表示):
某机字长8位,采用补码表示。若某数的补码为 1111\ 1110,则其真值为多少?若将其视为无符号数,真值又是多少?
· 解析:
· 视为补码(负数):按位取反得 1000\ 0001,加1得 1000\ 0010,真值为 -2。
· 视为无符号数:按权展开 128+64+32+16+8+4+2 = 254。
· 🔥 重点强化:这就是“解释权不同,结果天壤之别”的典型例子。
题目2(补码减法):
使用8位补码计算 15 - 20,并写出机器运算过程和溢出判断。
· 解析:
· [15]_{补} = 0000\ 1111
· [20]_{补} = 0001\ 0100,取反加1得 [-20]_{补} = 1110\ 1100
· 相加:0000\ 1111 + 1110\ 1100 = 1111\ 1011
· 结果解释:最高位为 1,是负数。转原码求真值:取反加1得 0000\ 0101,即 -5。
· 溢出判断:正数加负数,结果必然在范围内,无溢出。
题目3(CPU性能指标):
某CPU主频为 2GHz,程序包含 10^6 条指令,平均 CPI = 2.5。求该程序的 CPU 执行时间与 MIPS。
· 解析:
· 时钟周期 T = \frac{1}{2 \times 10^9}s = 0.5ns
· CPU执行时间 = \frac{10^6 \times 2.5}{2 \times 10^9} = 1.25 \times 10^{-3}s = 1.25ms
· MIPS = \frac{2 \times 10^9}{2.5 \times 10^6} = 800
题目4(综合真题陷阱):
某程序原本有 100 条指令,其中 40\% 为 LOAD 指令(CPI=2),60\% 为算术指令(CPI=1)。现在将 1 条 LOAD 和 1 条算术指令合并为 1 条新指令(CPI=3),新指令替换了原本 20\% 的算术指令。求优化后的新 CPI。
· 解析:
· 原指令数:LOAD = 40条,算术 = 60条。
· 被替换的算术指令:60 \times 20\% = 12 条。
· 新指令数:替换产生 12 条新指令;剩余算术 60 - 12 = 48 条;LOAD 不变 40 条。总指令数 M' = 12 + 48 + 40 = 100 条。(注:本题数字设计为刚好总数不变,如果换其他数字需按上文逻辑重新算比例。假设换数字导致总数为 M' = 88 条,则新比例需全部除以 88)。
· 新 CPI = (40/100)\times2 + (48/100)\times1 + (12/100)\times3 = 0.8 + 0.48 + 0.36 = \mathbf{1.64}。