小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2026-10-13 / 2 阅读
0
0

计算机组成原理核心考点复盘:数据表示与 CPU 性能指标

模块一:数据表示与运算(补码、移码、无符号数)

  1. 基础概念与数学表达

· 补码(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)

  1. 🔥 痛点突破:为什么补码和真值关系不如原码直观?

· 原码是“所见即所得”(符号位+绝对值,人类直觉,但机器运算复杂)。
· 补码是“所算即所得”(同余运算,机器直接当无符号数加,高位进位丢弃,硬件极简)。代价是违背人类直觉。
· 示例:真值 ​-5 的 8 位表示:
· 原码:​1000\ 0101 (直观)
· 补码:​1111\ 1011 (不直观,需大脑执行“取反加一”逆运算)

  1. 🔥 极值求解考题复盘(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)

  1. 🔥 C语言类型转换(无符号转有符号)复盘

· 例题:unsigned short usi = 65535; short si = usi; 求 ​si 的真值。
· 底层逻辑:位模式原封不动拷贝(都是 ​1111\ 1111\ 1111\ 1111)。
· 解释权变更:无符号数看全是数值;有符号数看最高位是符号位。最高位 ​1 代表负数。
· 求真值(补码转原码):符号位不变,数值位按位取反再加1,得到 ​1000\ 0000\ 0000\ 0001,即 ​-1。
· 速记:全 ​1 的补码,真值就是 ​-1。

  1. 补码减法与溢出判断

· 基本公式:​[A - B]_{补} = [A]_{补} + [-B]_{补}
· 求 ​[-B]_{补} 的方法:将 ​[B]_{补} 连同符号位一起按位取反,末位加 ​1。
· 溢出判断:
· 方法一:数学结果是否超出 ​[-128, 127](8位情况)。
· 方法二:两个同符号数相加,若结果符号与原符号相反,则发生溢出。(正+正=负,或 负+负=正 均为溢出)。
· 运算规则:最高位产生的进位 ​1 必须丢弃,只保留低8位。


模块二:CPU 性能指标

  1. 核心公式与关系表达

· 主频与时钟周期:​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}

  1. 🔥 痛点突破:真题中“增加新指令”为什么总指令数变了?

· 原文陷阱:“增加一种新指令”实为“替换”。
· 逻辑:编译器优化时,将原有的 [LOAD指令 + 算术逻辑指令] 合并替换成了 [1条新指令]。
· 后果:程序逻辑不变,但总指令条数绝对减少了!所以不能拿 ​M 作为新分母,必须计算出新的总指令数 ​M',再去求各指令的新比例。
· 公式:新总指令数 ​M' = M - (\text{被替换的指令数量})。
· 计算新比例时:​\text{新指令比例} = \frac{\text{新指令数量}}{M'}。

  1. 单位换算避坑指南

· ​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}。


评论