跳到主要内容

408模拟选择题 · 计算机组成原理 · 第2章 数据的表示和运算

2.1 数制与编码

2.1.2 定点数的编码表示

  1. 【王道·卷二-Q13】 在某8位计算机中,假定 x\displaystyle xy\displaystyle y 是两个带符号整数变量,用补码表示有 [x]=44H,[y]=DCH\displaystyle [x]_{补} = 44H, [y]_{补} = DCH,则 x/2+2y\displaystyle x / 2 + 2y 的机器数以及相应的溢出标志 OF\displaystyle OF 分别是( )。
A. CAH、0    B. CAH、1    C. DAH、0    D. DAH、1
查看答案与解析

答案: C

解析: [x]=44H=0100 0100B\displaystyle [x]_{补}=44\mathrm{H}=0100\ 0100\mathrm{B},符号位为 0\displaystyle 0,所以:

x=68\displaystyle x=68

[y]=DCH=1101 1100B\displaystyle [y]_{补}=\mathrm{DC H}=1101\ 1100\mathrm{B},符号位为 1\displaystyle 1。其真值为:

y=220256=36\displaystyle y=220-256=-36

因此:

x2+2y=3472=38\displaystyle \dfrac{x}{2}+2y=34-72=-38

38\displaystyle -38 的 8 位补码为:

2838=218=DAH\displaystyle 2^8-38=218=\mathrm{DA H}

8 位补码的表示范围为 [128,127]\displaystyle [-128,127],结果 38\displaystyle -38 在范围内,未发生溢出,因此 OF=0\displaystyle OF=0。故选择 C。

  • A、B:机器数 CAH 表示的真值是 54\displaystyle -54,与计算结果不符。
  • D:机器数 DAH 正确,但本题结果未溢出,OF\displaystyle OF 应为 0\displaystyle 0

  1. 【王道·卷六-Q17】 某计算机按字节编址,采用小端方式存储,其中某指令的一个操作数为16位,该操作数采用基址寻址方式,指令中的形式地址(用补码表示)为FF00H,当前基址寄存器的内容为C0000000H,则该操作数的MSB存放的地址是( )。
A. C000FF00H    B. C000FF01H    C. BFFFFF00H    D. BFFFFF01H
查看答案与解析

答案: D

解析: 形式地址 FF00H\displaystyle \mathrm{FF00H} 是 16 位补码,最高位为 1\displaystyle 1,表示负数。符号扩展到 32 位后为:

FFFFFF00H=256\displaystyle \mathrm{FFFFFF00H}=-256

有效地址为基址寄存器内容与符号扩展后的形式地址之和:

EA=C0000000H+FFFFFF00H=BFFFFF00H\displaystyle \begin{aligned} EA &=\mathrm{C0000000H}+\mathrm{FFFFFF00H}\\ &=\mathrm{BFFFFF00H} \end{aligned}

该操作数为 16 位,占两个字节。小端方式把最低有效字节 LSB 存放在低地址 EA\displaystyle EA,把最高有效字节 MSB 存放在高地址 EA+1\displaystyle EA+1。因此 MSB 的地址为:

BFFFFF00H+1=BFFFFF01H\displaystyle \mathrm{BFFFFF00H}+1=\mathrm{BFFFFF01H}

故选择 D。

  • A、B:错误地把 FF00H\displaystyle \mathrm{FF00H} 当作无符号正数直接与基址相加。
  • C:这是操作数最低有效字节 LSB 的存放地址,而不是 MSB 的地址。

  1. 【王道·卷七-Q18】 假设相对寻址的转移指令占 2B\displaystyle 2B,第一个字节是操作码,第二个字节是相对位移量,用补码表示。每当 CPU\displaystyle CPU 从存储器中取出 1B\displaystyle 1B 时,即自动完成 (PC)+1PC\displaystyle (PC) + 1 \rightarrow PC。若当前 PC\displaystyle PC 值为 2000H,2000H\displaystyle 2000H, 2000H 处的指令为 JMP9\displaystyle JMP* - 9\displaystyle * 为相对寻址特征),则执行这条指令后,PC\displaystyle PC 值为( )。
A. 1FF7H    B. 1FF8H    C. 1FF9H    D. 1FFAH
查看答案与解析

答案: C

解析: 当前 PC=2000H\displaystyle PC=2000\mathrm{H}。该转移指令占 2B\displaystyle 2\mathrm{B},CPU 每取出一个字节,PC\displaystyle PC 自动加 1\displaystyle 1。因此完成取指后:

PC=2000H+2=2002H\displaystyle PC=2000\mathrm{H}+2=2002\mathrm{H}

相对寻址的目标地址以“取完整条指令后的 PC\displaystyle PC”为基准,再加上带符号位移量。位移量为 9\displaystyle -9,所以:

PC目标=2002H9=1FF9H\displaystyle \begin{aligned} PC_{目标} &=2002\mathrm{H}-9\\ &=1FF9\mathrm{H} \end{aligned}

故选择 C。

  • A:直接用取指前的 2000H\displaystyle 2000\mathrm{H}9\displaystyle -9,忽略了取指过程中 PC\displaystyle PC 已增加 2\displaystyle 2
  • B、D:对指令长度或负位移量的计算存在偏差。

  1. 【王道·卷八-Q12】 某计算机按字节编址,采用小端方式存储信息。其中,某指令的一个操作数为16位,该操作数采用基址寻址方式,指令中的形式地址(用补码表示)为 FF00H\displaystyle FF00H,当前基址寄存器的内容为C0000000H,则该操作数的LSB中存放的地址是( )。
A. BFFFFF00H    B. BFFFFF01H    C. C000FF00H    D. C000FF01H
查看答案与解析

答案: A

解析: 形式地址 FF00H\displaystyle FF00H 是一个16位补码。由于最高位为 1\displaystyle 1,它表示负数,符号扩展到32位后为:

FFFFFF00H=256\displaystyle \mathrm{FFFFFF00H}=-256

基址寻址的有效地址为基址寄存器内容与符号扩展后的形式地址之和:

EA=C0000000H+FFFFFF00H=BFFFFF00H\displaystyle \begin{aligned} EA &=\mathrm{C0000000H}+\mathrm{FFFFFF00H}\\ &=\mathrm{BFFFFF00H} \end{aligned}

该操作数为16位,占两个字节。小端方式把最低有效字节 LSB 存放在低地址,把最高有效字节 MSB 存放在高地址。因此,LSB 所在地址就是有效地址 EA\displaystyle EA,即 BFFFFF00H\displaystyle \mathrm{BFFFFF00H}。故选择 A。

  • B:是该16位操作数的 MSB 所在地址。
  • C、D:错误地将 FF00H\displaystyle FF00H 当作无符号正数参与地址计算。

  1. 【王道·卷八-Q18】 假定采用相对寻址方式的转移指令占2B,第一个字节是操作码,第二个字节是相对位移量(用补码表示)。取指令时,每次CPU从存储器中取出一个字节,并且自动完成 PC+1PC\displaystyle PC + 1\rightarrow PC 操作。假设执行到某条转移指令时(取指令前),PC\displaystyle PC 的内容为200CH,该指令的转移目标地址为1FB0H,则该转移指令的第二个字节的内容应是( )。
A. 5CH    B. 5EH    C. 42H    D. 4AH
查看答案与解析

答案: 源题选项有误,正确结果应为 A2H

解析: 该指令共占 2B\displaystyle 2\mathrm{B}。取指令前 PC=200CH\displaystyle PC=200CH,每取一个字节 PC\displaystyle PC 自动加 1\displaystyle 1,因此整条指令取完后:

PC=200CH+2=200EH\displaystyle PC=200CH+2=200EH

相对寻址满足:

目标地址=取指结束后的 PC+相对位移量\displaystyle \text{目标地址}=\text{取指结束后的 }PC+\text{相对位移量}

因而相对位移量为:

Δ=1FB0H200EH=5EH\displaystyle \begin{aligned} \Delta &=1FB0H-200EH\\ &=-5EH \end{aligned}

第二个字节采用8位补码表示。5EH\displaystyle -5EH 的8位补码为:

100H5EH=A2H\displaystyle 100H-5EH=A2H

所以第二个字节应为 A2H\displaystyle A2H。原题给出的 A~D 四个选项均不等于 A2H\displaystyle A2H,属于选项录入错误。合并题库后文的同题“竟成·模拟三-16”中给出了 A2H\displaystyle A2H 这一正确选项,可相互印证。

  • A、B:分别是正数 5CH\displaystyle 5CH5EH\displaystyle 5EH,没有按补码表示负位移。
  • C、D:对应的位移量也无法使 PC\displaystyle PC200EH\displaystyle 200EH 转移到 1FB0H\displaystyle 1FB0H

  1. 【竟成·模拟七-14】 一个8位的二进制整数由2个“0”和6个“1”组成,采用补码或者移码表示,则下列说法中正确的是()。
A. 若采用移码表示,偏置值为127,则此整数最小为-64
B. 若采用移码表示,偏置值为128,则此整数最大为123
C. 若采用补码表示,则此整数最小为-96
D. 若采用补码表示,则此整数最大为252
查看答案与解析

答案: A

解析: 该8位编码中恰有2个 0\displaystyle 0 和6个 1\displaystyle 1

**判断 A:**移码偏置值为127时,真值等于无符号编码值减去127。要使真值最小,应使编码值最小,即把两个 0\displaystyle 0 放在最高两位:

001111112=63\displaystyle 00111111_2=63

因此最小真值为:

63127=64\displaystyle 63-127=-64

A 正确。

**判断 B:**偏置值为128时,要使真值最大,应使编码值最大,即把两个 0\displaystyle 0 放在最低两位:

111111002=252\displaystyle 11111100_2=252

最大真值为:

252128=124\displaystyle 252-128=124

不是123,B错误。

**判断 C:**补码表示的最小值应为符号位为 1\displaystyle 1 时数值最小的编码。将两个 0\displaystyle 0 放在次高位和第三高位,得到:

100111112=159\displaystyle 10011111_2=159

对应真值为:

159256=97\displaystyle 159-256=-97

不是 96\displaystyle -96,C错误。

**判断 D:**补码表示的最大正数必须符号位为 0\displaystyle 0。另一个 0\displaystyle 0 放在最低位时编码最大:

011111102=126\displaystyle 01111110_2=126

最大值是126,不是252,D错误。


2.1.4 C语言中的整数类型及类型转换

  1. 【王道·卷一-Q18】 假定编译器对C语言程序中的变量和计算机中的寄存器做了以下分配:变量 f\displaystyle fg\displaystyle gh\displaystyle hi\displaystyle ij\displaystyle j 分别分配到寄存器 s0\displaystyle s0s1\displaystyle s1s2\displaystyle s2s3\displaystyle s3s4\displaystyle s4 中,并将一条C语言赋值语句编译后,生成如下汇编代码序列,第一个操作数是目的操作数。
Text
add t0, s1, s2
add t1, s3, s4
sub s0, t0, t1

这条C语言赋值语句是( )。

A. f=(g+i)(h+j)\displaystyle f = (g + i) - (h + j)    B. f=(g+h)(i+j)\displaystyle f = (g + h) - (i + j)
C. f=(g+j)(h+i)\displaystyle f = (g + j) - (h + i)    D. f=(h+j)(g+i)\displaystyle f = (h + j) - (g + i)
查看答案与解析

答案: B

解析: 根据寄存器分配关系:

s0f,s1g,s2h,s3i,s4j\displaystyle s0\leftrightarrow f,\quad s1\leftrightarrow g,\quad s2\leftrightarrow h,\quad s3\leftrightarrow i,\quad s4\leftrightarrow j

第一条指令:

Text
add t0, s1, s2

表示:

t0=g+h\displaystyle t0=g+h

第二条指令表示:

t1=i+j\displaystyle t1=i+j

第三条指令:

Text
sub s0, t0, t1

表示:

f=t0t1=(g+h)(i+j)\displaystyle f=t0-t1=(g+h)-(i+j)

故选择 B。其余选项均与寄存器的对应关系或减法的操作数顺序不符。


  1. 【王道·卷四-Q13】 某C语言程序在一台32位机器上运行,程序中定义了一个unsigned short型变量 us=215\displaystyle us = 2^{15},一个int型变量 x\displaystyle x,则执行赋值语句 x=us\displaystyle x = us 后,x\displaystyle x 的值变为( )。
A. 215\displaystyle 2^{15}    B. 215\displaystyle -2^{15}    C. 232215\displaystyle 2^{32} - 2^{15}    D. 231\displaystyle 2^{31}
查看答案与解析

答案: A

解析: unsigned short通常为16位,其表示范围为:

02161\displaystyle 0\sim 2^{16}-1

因此 us=215=32768\displaystyle us=2^{15}=32768 可以被准确表示。将16位无符号整数转换为32位 int 时,由于32位 int 的表示范围包含32768,系统进行零扩展,高位补 0\displaystyle 0

1000 0000 0000 00000000 0000 0000 0000 1000 0000 0000 0000\displaystyle 1000\ 0000\ 0000\ 0000 \longrightarrow 0000\ 0000\ 0000\ 0000\ 1000\ 0000\ 0000\ 0000

转换后数值保持不变,所以:

x=215\displaystyle x=2^{15}

故选择 A。

  • B:把原16位位模式错误地按有符号 short 解释。
  • C:是将负数转换为32位无符号整数时可能出现的模运算结果,本题不适用。
  • D:与本题的位扩展规则无关。

  1. 【王道·卷五-Q14】C\displaystyle C 语言的不同类型数据强制类型转换中,说法错误的是( )。
A. 从int类型转换成float类型时,数据可能会溢出
B. 从int类型转换成double类型时,数据不会溢出
C. 从double类型转换成float类型时,数据可能会溢出,也可能舍入
D. 从double类型转换成int类型时,数据可能会舍入
查看答案与解析

答案: A

解析: 在通常的32位 int、IEEE 754单精度 float 和双精度 double 环境中:

  • int 的数值范围约为 [231,2311]\displaystyle [-2^{31},2^{31}-1]
  • 单精度 float 的有限数表示范围约为 10381038\displaystyle 10^{-38}\sim 10^{38},远大于32位 int 的范围。

因此,int 转换为 float 时不会因范围不足而溢出,但由于 float 只有24位有效精度,某些较大的整数不能被精确表示,可能发生舍入。A 将“精度损失”错误地说成“溢出”,故 A 错误。

  • B:double 具有约53位二进制有效精度,能精确表示所有32位 int,不会溢出,正确。
  • C:double 的范围和精度都大于 float,转换为 float 时可能因超出范围而溢出,也可能因精度降低而舍入,正确。
  • D:double 转换为 int 时,小数部分按向零方向截断,可视为向零舍入;若数值超出 int 范围,还可能发生范围问题。因此该说法不属于本题错误项。

  1. 【王道·卷六-Q12】 已知 C\displaystyle C 程序中,某int型变量 x\displaystyle x 的值为-1088。程序执行时,x\displaystyle x 先被存放在16位寄存器R1中,然后进行算术右移4位的操作,则此时R1中的内容(十六进制数表示)是( )。
A. FBC0H\displaystyle FBC0H    B. FFBCH\displaystyle FFBCH    C. 0FBCH\displaystyle 0FBCH    D. 87BCH\displaystyle 87BCH
查看答案与解析

答案: B

解析: 先将 1088\displaystyle -1088 写成十六进制。因为:

1088=440H\displaystyle 1088=440H

16位补码为:

10000H440H=FBC0H\displaystyle 10000H-440H=FBC0H

所以算术右移前:

R1=FBC0H=1111 1011 1100 00002\displaystyle R1=FBC0H=1111\ 1011\ 1100\ 0000_2

算术右移时,高位补符号位 1\displaystyle 1。右移4位后得到:

1111 1111 1011 11002=FFBCH\displaystyle 1111\ 1111\ 1011\ 1100_2=FFBCH

故选择 B。

  • A:是右移前的原始补码。
  • C:相当于逻辑右移,高位补 0\displaystyle 0,不符合负数算术右移规则。
  • D:不是该补码算术右移4位的结果。

  1. 【竟成·模拟一-13】 某C语言编译器规定short类型为16位,int类型为32位,long long类型为64位,float采用IEEE754单精度浮点数表示。则执行下列C语言代码段后,t的值是()。
C
short s = -1;
unsigned int u = s;
float f = u;
long long t = f;
A. 231\displaystyle 2^{31}    B. 2311\displaystyle 2^{31}-1    C. 232\displaystyle 2^{32}    D. 2321\displaystyle 2^{32}-1
查看答案与解析

答案: C

解析: 第一步,short s = -1。16位补码为全 1\displaystyle 1

s=FFFFH\displaystyle s=FFFFH

第二步,将有符号整数 1\displaystyle -1 转换为32位 unsigned int。C语言按模 232\displaystyle 2^{32} 转换:

u=2321\displaystyle u=2^{32}-1

第三步,将 u\displaystyle u 转换为IEEE 754单精度浮点数。单精度浮点数只有24位有效精度,而 2321\displaystyle 2^{32}-1 需要32位有效二进制位,不能精确表示。按就近舍入,2321\displaystyle 2^{32}-1 会舍入为:

f=232\displaystyle f=2^{32}

第四步,将 f\displaystyle f 转换为64位 long long232\displaystyle 2^{32} 在64位有符号整数范围内,可准确转换,因此:

t=232\displaystyle t=2^{32}

故选择 C。

  • D:是变量 u\displaystyle u 的整数值,但转换成单精度浮点数时发生了舍入。
  • A、B:与32位无符号转换及浮点舍入结果均不符。

  1. 【竟成·模拟四-13】 以下C语言程序段,在执行完成后,输出的y的值为()。
C
int x = 131071;
unsigned short y = x;
printf("%u", y);
A. 131071    B. 65536    C. 65535    D. 32767
查看答案与解析

答案: C

解析: unsigned short为16位,表示范围为:

02161=65535\displaystyle 0\sim 2^{16}-1=65535

将32位 int 转换为16位 unsigned short 时,只保留低16位,相当于对 216\displaystyle 2^{16} 取模:

y=131071mod65536=65535\displaystyle \begin{aligned} y &=131071\bmod 65536\\ &=65535 \end{aligned}

也可从十六进制观察:

131071=0001FFFFH\displaystyle 131071=0001FFFFH

截断高16位后得到:

y=FFFFH=65535\displaystyle y=FFFFH=65535

故选择 C。

  • A:超出了16位无符号整数的表示范围。
  • B、D:均不是保留低16位后的结果。

2.2 运算方法和运算电路

2.2.2 定点数的移位运算

  1. 【竟成·模拟二-13】 对于一个4位二进制补码x1x2x3x4\displaystyle x_1x_2x_3x_4,其算术左移一位发生溢出的条件是()。
A. x1=1\displaystyle x_1=1    B. x1=x2\displaystyle x_1=x_2    C. x1x2\displaystyle x_1\ne x_2    D. x2=1\displaystyle x_2=1
查看答案与解析

答案: C

解析: 对4位补码 x1x2x3x4\displaystyle x_1x_2x_3x_4 进行算术左移一位时,最高位 x1\displaystyle x_1 被移出,原次高位 x2\displaystyle x_2 成为新的符号位,最低位补 0\displaystyle 0

x1x2x3x4x2x3x40\displaystyle x_1x_2x_3x_4\longrightarrow x_2x_3x_4\,0

补码左移一位在数值上相当于乘以 2\displaystyle 2。若原符号位 x1\displaystyle x_1 与左移后的新符号位 x2\displaystyle x_2 不同,说明结果的符号发生异常变化,即发生溢出。因此溢出条件为:

x1x2\displaystyle x_1\ne x_2

故选择 C。

  • A、D:单独判断某一位是否为 1\displaystyle 1 不能确定是否溢出。
  • B:x1=x2\displaystyle x_1=x_2 时,新旧符号一致,恰好表示未溢出。

2.2.3 定点数的加减运算

  1. 【竟成·模拟三-13】 某计算机字长为8位,其CPU中有一个8位整数加减运算器。已知带符号数x=-69、y=38,若要在该运算器中完成x-y的运算,则该运算器的两个输入端信息和输入的低位进位信息分别为()。
A. 10111011、11011001、1    B. 11000101、00100110、1
C. 11000101、11011001、0    D. 11000110、00100110、0
查看答案与解析

答案: A

解析: 8 位加减运算器通常利用同一个加法器完成减法:

xy=x+y+1\displaystyle x-y=x+\overline{y}+1

其中,减数各位取反后送入加法器第二输入端,并令最低位进位输入为 1\displaystyle 1

首先求 x=69\displaystyle x=-69 的 8 位补码:

69=010001012[69]=101110112\displaystyle \begin{aligned} 69&=01000101_2\\ [-69]_{补}&=10111011_2 \end{aligned}

再求 y=38\displaystyle y=38 的二进制表示及其按位取反结果:

[38]=001001102[38]=110110012\displaystyle \begin{aligned} [38]_{补}&=00100110_2\\ \overline{[38]_{补}}&=11011001_2 \end{aligned}

因而两个输入端分别为 10111011\displaystyle 1011101111011001\displaystyle 11011001,低位进位为 1\displaystyle 1,故选择 A。

  • B:第一个输入并不是 69\displaystyle -69 的补码,且第二输入未对减数取反。
  • C:两个数据输入正确,但低位进位应为 1\displaystyle 1,否则只能得到 xy1\displaystyle x-y-1
  • D:两个输入均不符合补码减法器的输入规则。

  1. 【竟成·模拟七-15】 已知整数A、B的机器数分别是BCH和71H,如果在8位加法器中计算A-B,那么运算后的溢出标志OF、符号标志SF、进/借位标志CF分别是()。
A. 1、0、0    B. 1、0、1    C. 0、1、1    D. 0、0、0
查看答案与解析

答案: A

解析: 将两个 8 位机器数按补码解释:

A=BCH=101111002=68B=71H=011100012=113\displaystyle \begin{aligned} A&=\mathrm{BCH}=10111100_2=-68\\ B&=\mathrm{71H}=01110001_2=113 \end{aligned}

减法由加法器按下式完成:

AB=A+B+1\displaystyle A-B=A+\overline{B}+1

其中:

B+1=100011112\displaystyle \overline{B}+1=10001111_2

因此:

10111100+10001111=(1)01001011\displaystyle \begin{aligned} 10111100+10001111 &=(1)01001011 \end{aligned}

8 位结果为 01001011\displaystyle 01001011,最高位为 0\displaystyle 0,所以:

SF=0\displaystyle SF=0

从有符号数角度看,实际数学结果为:

68113=181\displaystyle -68-113=-181

该数超出 8 位补码的表示范围 [128,127]\displaystyle [-128,127]。负数减正数却得到正的机器结果,故发生有符号溢出:

OF=1\displaystyle OF=1

本次加法器最高位产生进位,即 Cout=1\displaystyle C_{out}=1。减法控制信号 Sub=1\displaystyle Sub=1,进/借位标志为:

CF=SubCout=11=0\displaystyle CF=Sub\oplus C_{out}=1\oplus1=0

因此 OF=1\displaystyle OF=1SF=0\displaystyle SF=0CF=0\displaystyle CF=0,选择 A。

  • B:减法没有发生借位,因此 CF\displaystyle CF 不应为 1\displaystyle 1
  • C、D:均错误地判定为未发生有符号溢出。

2.2.4 定点数的乘除运算

  1. 【王道·卷五-Q19】 对汇编语言程序员来说,以下部件中不透明的是( )。 I. 指令缓冲器 II. 移位器 III. 通用寄存器 IV. 中断字寄存器 V. 乘法器 VI. 先行进位链
A. I、II和III    B. IV、V和VI    C. III和IV    D. I、II、V和VI
查看答案与解析

答案: C

解析: 在计算机系统中,“透明”是指某个部件或实现细节对程序员不可见,程序员无须感知其存在;“不透明”则表示程序员能够直接感知或通过指令访问。

逐项判断:

  • I 指令缓冲器:属于处理器内部的取指实现部件,对汇编语言程序员透明。
  • II 移位器:属于实现移位指令的内部硬件,对汇编语言程序员透明。
  • III 通用寄存器:可在汇编指令中直接指定和访问,对汇编语言程序员不透明。
  • IV 中断字寄存器:用于反映中断及处理机状态,属于体系结构可见状态,对汇编语言程序员不透明。
  • V 乘法器:程序员只能使用乘法指令,无须知道乘法器的具体结构,对程序员透明。
  • VI 先行进位链:属于加法器内部实现细节,对程序员透明。

因此不透明的是 III、IV,选择 C。


  1. 【王道·卷八-Q14】 假设一次ALU运算花费1个时钟周期,一次移位运算花费1个时钟周期,若忽略其他操作的时间,则计算机实现32位原码一位乘法花费的时钟周期数最多为( )。
A. 32    B. 63    C. 64    D. 65
查看答案与解析

答案: C

解析: 原码一位乘法将符号与数值部分分别处理,数值部分采用逐位乘法。32 位乘数需要进行 32 轮迭代,每轮完成以下两项操作:

  1. 根据乘数当前最低位决定部分积加上被乘数或加 0\displaystyle 0,需要一次 ALU 运算;
  2. 将部分积和乘数寄存器整体右移一位,需要一次移位运算。

在最坏情况下,每一轮都需要进行一次有效加法。因此所需时钟周期数最多为:

32×(1+1)=64\displaystyle 32\times(1+1)=64

故选择 C。

  • A:只计算了 32 次迭代中的一种操作。
  • B:少计算了一次必要操作。
  • D:多计算了题目已说明可以忽略的其他控制操作。

  1. 【竟成·模拟一-14】 计算机字长为32位,在进行32位补码整数除法运算时,除数寄存器Y的初始值为FFFFFFFFH,余数寄存器R的初始值为FFFFFFFFH,余数/商寄存器Q的初始值为80000000H,则除法结果是()。
A. 231\displaystyle 2^{31}    B. 231\displaystyle -2^{31}    C. 发生溢出    D. 除0异常
查看答案与解析

答案: C

解析: 32 位补码中:

Y=FFFFFFFFH=1Q=80000000H=231\displaystyle \begin{aligned} Y&=\mathrm{FFFFFFFFH}=-1\\ Q&=\mathrm{80000000H}=-2^{31} \end{aligned}

余数寄存器 R=FFFFFFFFH\displaystyle R=\mathrm{FFFFFFFFH} 是被除数符号扩展后的高位部分,因此被除数为 231\displaystyle -2^{31}。所求商为:

2311=231\displaystyle \dfrac{-2^{31}}{-1}=2^{31}

但 32 位补码整数的表示范围为:

231x2311\displaystyle -2^{31}\le x\le 2^{31}-1

正数 231\displaystyle 2^{31} 超出最大可表示值 2311\displaystyle 2^{31}-1,因此发生除法溢出,选择 C。

  • A:这是数学上的商,但无法用 32 位有符号补码表示。
  • B:商的符号应为正。
  • D:除数为 1\displaystyle -1,并非 0\displaystyle 0

  1. 【竟成·模拟三-14】 假定一次ALU运算用时1个时钟周期,一次移位用时1个时钟周期,辅助位与MQ最低位相同时需要先(ACC)+0后再右移,则最快的32位Booth乘法(补码一位乘法,包括一位符号位)所需的时钟周期数大约为()。
A. 32    B. 63    C. 64    D. 65
查看答案与解析

答案: C

解析: Booth 一位乘法每轮检查乘数寄存器最低位与辅助位的组合:

  • 01\displaystyle 01:部分积加被乘数;
  • 10\displaystyle 10:部分积减被乘数;
  • 00\displaystyle 0011\displaystyle 11:部分积加 0\displaystyle 0

题目特别规定,即使辅助位与 MQ 最低位相同,也必须先执行 (ACC)+0\displaystyle (ACC)+0,再进行算术右移。因此每轮都固定需要:

1 次 ALU 运算+1 次移位=2 个时钟周期\displaystyle 1\text{ 次 ALU 运算}+1\text{ 次移位}=2\text{ 个时钟周期}

32 位 Booth 乘法需要进行 32 轮,故最快也需要:

32×2=64\displaystyle 32\times2=64

因此选择 C。

  • A:只计算了移位或 ALU 运算中的一种。
  • B:少计算了一个时钟周期。
  • D:多计算了题目忽略的其他操作时间。

2.3 浮点数的表示与运算

2.3.1 IEEE754标准的浮点数

  1. 【王道·卷四-Q14】 在IEEE754标准的规格化单精度浮点数中,所能表示的最接近0的负数是( )。
A. 2126\displaystyle -2^{-126}    B. 2(223)×2126\displaystyle -2^{(2-23)} \times 2^{-126}    C. 2(223)×2127\displaystyle -2^{(2-23)} \times 2^{-127}    D. 2127\displaystyle -2^{-127}
查看答案与解析

答案: A

解析: IEEE 754 单精度浮点数的规格化形式为:

(1)S×(1.M)×2E127\displaystyle (-1)^S\times(1.M)\times2^{E-127}

对规格化数而言,阶码字段的最小非零值为 E=1\displaystyle E=1,对应实际阶码:

1127=126\displaystyle 1-127=-126

要得到最接近 0\displaystyle 0 的负规格化数,应令:

  • 符号位 S=1\displaystyle S=1
  • 阶码取最小规格化阶码 126\displaystyle -126
  • 尾数的小数部分全为 0\displaystyle 0,即有效数为 1.0\displaystyle 1.0

因而该数为:

1.0×2126=2126\displaystyle -1.0\times2^{-126}=-2^{-126}

故选择 A。

  • D:实际阶码 127\displaystyle -127 不属于单精度规格化数的正常阶码范围。
  • B、C:均不符合规格化数的最小有效数 1.0\displaystyle 1.0 与最小实际阶码 126\displaystyle -126 的组合。

  1. 【王道·卷五-Q13】 在下列关于补码和浮点数运算的说法中,正确的是( )。 I. 定点补码运算时,其符号位不参与运算 II. 浮点运算可由阶码运算和尾数运算两部分组成 III. 阶码在乘除运算时只进行加、减操作 IV. 浮点数的正负由阶码的正负符号决定 V. 尾数只进行乘除运算
A. I、II和III    B. I、II和V    C. II、III和IV    D. II和III
查看答案与解析

答案: D

解析: 逐项判断:

  • I 错误。补码运算的优点之一就是符号位与数值位统一参与加减运算。
  • II 正确。浮点运算通常可分解为阶码处理和尾数处理,例如加减法需要对阶与尾数加减,乘除法需要阶码加减与尾数乘除。
  • III 正确。浮点乘法时阶码相加,浮点除法时阶码相减,并根据偏置值进行相应修正,本质仍是加减运算。
  • IV 错误。浮点数的正负由整个浮点数的符号位决定,与阶码的正负无关。
  • V 错误。尾数不仅进行乘除运算,在浮点加减法中还要进行尾数加减、移位、规格化和舍入。

因此正确的是 II、III,选择 D。


  1. 【王道·卷七-Q13】 在IEEE754标准的单精度浮点数中,最大规格化负数的机器数为( )。
A. 80C00000H    B. 80800000H    C. 80000000H    D. 80000001H
查看答案与解析

答案: B

解析: “最大负数”是指在所有负数中数值最大,即最接近 0\displaystyle 0 的负规格化数。IEEE 754 单精度格式中,该数为:

1.0×2126\displaystyle -1.0\times2^{-126}

对应各字段为:

  • 符号位:1\displaystyle 1
  • 阶码字段:00000001\displaystyle 00000001
  • 尾数字段:23 位全 0\displaystyle 0

因此机器数为:

Text
1 00000001 00000000000000000000000

写成十六进制即:

80800000H\displaystyle \mathrm{80800000H}

故选择 B。

  • A:尾数字段不全为 0\displaystyle 0,其绝对值更大,数值反而更小。
  • C:阶码和尾数均为全 0\displaystyle 0,表示负零,不是规格化数。
  • D:表示负的非规格化数,也不属于规格化数。

  1. 【竟成·模拟二-14】 如果浮点数的尾数改为用补码表示,则下列选项()是规格化尾数形式(提示:以下各选项中,首位均为符号位)。
A. 1.1111111    B. 0.0000000    C. 0.0101010    D. 1.0110110
查看答案与解析

答案: D

解析: 当浮点数尾数采用补码表示时,规格化尾数要求符号位与最高数值位不同:

  • 正数应为 0.1\displaystyle 0.1\cdots
  • 负数应为 1.0\displaystyle 1.0\cdots

这是因为若符号位与最高数值位相同,则还可以继续左移尾数、减小阶码,说明当前形式尚未规格化。

逐项判断:

  • A:1.1111111\displaystyle 1.1111111 的符号位和最高数值位均为 1\displaystyle 1,未规格化。
  • B:0.0000000\displaystyle 0.0000000 表示 0\displaystyle 0,不作为一般规格化尾数。
  • C:0.0101010\displaystyle 0.0101010 的符号位和最高数值位均为 0\displaystyle 0,未规格化。
  • D:1.0110110\displaystyle 1.0110110 的符号位为 1\displaystyle 1,最高数值位为 0\displaystyle 0,满足负数补码规格化形式。

因此选择 D。


  1. 【竟成·模拟五-13】 IEEE754单精度浮点格式表示的数中,最小的正数是()。
A. 1.0×2126\displaystyle 1.0\times 2^{-126}    B. 1.0×2127\displaystyle 1.0\times 2^{-127}    C. 1.0×2149\displaystyle 1.0\times 2^{-149}    D. 1.0×2150\displaystyle 1.0\times 2^{-150}
查看答案与解析

答案: C

解析: IEEE 754 单精度浮点数由 1 位符号位、8 位阶码和 23 位尾数字段组成。

题目问的是“最小的正数”,并未限定为规格化数,因此应考虑非规格化数。非规格化数的阶码字段全为 0,其实际阶码固定为 126\displaystyle -126,且有效数没有隐藏的整数位 1,而是形如 0.f\displaystyle 0.f

最小正非规格化数的尾数字段只有最低位为 1,即:

0.0000012×2126=223×2126=2149\displaystyle 0.000\cdots001_2\times 2^{-126} =2^{-23}\times2^{-126} =2^{-149}

因此,IEEE 754 单精度格式能够表示的最小正数为 2149\displaystyle 2^{-149},选择 C。

  • A:2126\displaystyle 2^{-126} 是最小正规格化数。
  • B、D:均不符合单精度浮点数的阶码和尾数位数规定。

2.3.2 浮点数的加减运算

  1. 【王道·卷二-Q14】 在IEEE754单精度浮点数的加减运算中,当对阶操作得到的两个阶码之差的绝对值 ΔE\displaystyle |\Delta E| 大于或等于( )时,就无须继续进行后续操作,此时运算结果直接取阶大的那个数。已知在对阶移位时保留两位附加位,在根据附加位进行舍入时采用就近舍入的方式。
A. 24    B. 25    C. 126    D. 128
查看答案与解析

答案: B

解析: IEEE 754 单精度浮点数的尾数字段为 23 位,规格化数还有一个隐藏的最高位 1,因此有效数的实际精度为 24 位。

浮点加减时,需要将阶码较小数的尾数右移,使两个数的阶码相同。若阶码差为 d\displaystyle d,则小数的有效数相对于大数缩小为原来的 2d\displaystyle 2^{-d}

d=25\displaystyle d=25 时,小数对大数结果的最大影响严格小于:

2×225=224\displaystyle 2\times2^{-25}=2^{-24}

而 24 位有效数相邻可表示数的间隔为一个 ulp,即约为 223\displaystyle 2^{-23},就近舍入的半个 ulp 为 224\displaystyle 2^{-24}。因此,当 ΔE25\displaystyle |\Delta E|\ge 25 时,小数已不足以改变最终舍入结果,运算结果可直接取阶码较大的操作数。

ΔE=24\displaystyle |\Delta E|=24,较小数仍可能达到或超过半个 ulp,从而影响舍入,不能直接忽略。

所以选择 B。


  1. 【王道·卷六-Q13】 在IEEE754单精度浮点数的加、减运算中,两个浮点数分别记为 [x]\displaystyle [x]_{浮}[y]\displaystyle [y]_{浮},对阶操作时,需计算两个阶码 EX\displaystyle EXEY\displaystyle EY 之差的补码 [ΔE]\displaystyle [\Delta E]_{补}(结果用8位二进制补码表示),[EX]\displaystyle [EX]_{补}[EY]\displaystyle [EY]_{补}[ΔE]\displaystyle [\Delta E]_{补} 的最高有效位分别记为 EXS\displaystyle EXSEYS\displaystyle EYSEBS\displaystyle EBS,当 [ΔE]\displaystyle [\Delta E]_{补} 发生溢出时,正确的处理方式是( )。
A. 中止当前程序的执行,并转到相应的“溢出”异常处理程序
B. 当 EXS\displaystyle EXS 为1时,置最终结果为 [x]\displaystyle [x]_{浮};当 EXS\displaystyle EXS 为0时,置最终结果为 [y]\displaystyle [y]_{浮}
C. 当 EYS\displaystyle EYS 为1时,置最终结果为 [x]\displaystyle [x]_{浮};当 EYS\displaystyle EYS 为0时,置最终结果为 [y]\displaystyle [y]_{浮}
D. 当 EBS\displaystyle EBS 为0时,置最终结果为 [x]\displaystyle [x]_{浮};当 EBS\displaystyle EBS 为1时,置最终结果为 [y]\displaystyle [y]_{浮}
查看答案与解析

答案: C

解析: 对阶时计算:

ΔE=EXEY\displaystyle \Delta E=EX-EY

8 位补码减法发生溢出,说明两个阶码异号,且它们的实际差值绝对值过大,已经超出 8 位补码的表示范围。此时两数的数量级相差极大,阶码较小的数对结果不再产生影响,可直接取阶码较大的操作数。

分两种情况讨论:

  1. EYS=1\displaystyle EYS=1,则 EY\displaystyle EY 为负,而发生溢出时 EX\displaystyle EX 必为非负。因此 EX>EY\displaystyle EX>EY,应直接取 [x]\displaystyle [x]_{浮}
  2. EYS=0\displaystyle EYS=0,则 EY\displaystyle EY 为非负,而发生溢出时 EX\displaystyle EX 必为负。因此 EY>EX\displaystyle EY>EX,应直接取 [y]\displaystyle [y]_{浮}

这正对应选项 C。

  • A:阶码差溢出并不是程序错误,而是说明两操作数数量级相差过大,可直接确定运算结果。
  • B:仅依据 EXS\displaystyle EXS 给出的取值方向与实际大小关系相反。
  • D:EBS\displaystyle EBS 是已经溢出的错误符号,不能用它判断真实阶码大小。

  1. 【竟成·模拟一-15】 IEEE754双精度浮点格式表示的数中,最大的非规格化数与最大的负规格化数作和的结果是()。
A. 2107521023\displaystyle -2^{-1075}-2^{-1023}    B. 2107421022\displaystyle -2^{-1074}-2^{-1022}    C. 21074\displaystyle 2^{-1074}    D. 21074\displaystyle -2^{-1074}
查看答案与解析

答案: D

解析: IEEE 754 双精度浮点数的尾数字段为 52 位,最小规格化实际阶码为 1022\displaystyle -1022

最大的正非规格化数为:

x=0.1111112×21022=(1252)×21022=2102221074\displaystyle \begin{aligned} x &=0.111\cdots111_2\times2^{-1022}\\ &=(1-2^{-52})\times2^{-1022}\\ &=2^{-1022}-2^{-1074} \end{aligned}

“最大的负规格化数”是指最接近 0 的负规格化数,因此:

y=1.0×21022=21022\displaystyle y=-1.0\times2^{-1022}=-2^{-1022}

两者相加:

x+y=(2102221074)21022=21074\displaystyle \begin{aligned} x+y &=(2^{-1022}-2^{-1074})-2^{-1022}\\ &=-2^{-1074} \end{aligned}

所以选择 D。该结果恰好是绝对值最小的负非规格化数。


  1. 【竟成·模拟七-13】 对于IEEE 754单精度浮点数加减运算,若运算结果直接取阶大的数,则两操作数的阶码之差的绝对值大于等于()。
A. 24    B. 25    C. 126    D. 128
查看答案与解析

答案: B

解析: IEEE 754 单精度浮点数具有 23 位显式尾数和 1 位隐藏位,因此有效数精度为 24 位。

对阶时,阶码较小数的尾数需要右移。当阶码差达到 25 时,较小数的最大有效尾数右移后也小于大数最低有效位权值的一半,即不足半个 ulp,在就近舍入规则下不会改变最终结果。

因此,当:

ΔE25\displaystyle |\Delta E|\ge 25

时,可直接取阶码较大的操作数,选择 B。

阶码差为 24 时,较小数仍可能影响最低有效位的舍入,不能一概忽略。


2.3.3 C语言中的浮点数类型

  1. 【王道·卷一-Q14】 double pow(double x, double y)C\displaystyle C 语言标准库中的一个函数,用于计算一个数的幂,其返回值为 xy\displaystyle x^{y},执行下列 C\displaystyle C 语言程序片段后,变量 f\displaystyle f 的值是( )。
C
float f = 2.5 + pow(2,33);
f = f - pow(2,33);
A. 0    B. 2.5    C. 2    D. 233
查看答案与解析

答案: A

解析: pow(2,33) 的返回类型为 double,其值为 233\displaystyle 2^{33}。第一条赋值语句右侧先按 double 类型计算:

233+2.5\displaystyle 2^{33}+2.5

随后赋给 float 型变量 f\displaystyle f。单精度浮点数有效精度为 24 位,在 233\displaystyle 2^{33} 附近,相邻两个可表示 float 数之间的间隔为:

23323=210=1024\displaystyle 2^{33-23}=2^{10}=1024

因此 2.5\displaystyle 2.5 远小于半个间隔,转换为 float 时被舍去,最终:

f=233\displaystyle f=2^{33}

执行第二条语句时,f\displaystyle f 被提升为 double,与 pow(2,33) 相减:

233233=0\displaystyle 2^{33}-2^{33}=0

再赋回 float,结果仍为 0。因此选择 A。


  1. 【王道·卷三-Q14】 某导弹系统有一个内置时钟,用计数器实现,每隔 0.1s\displaystyle 0.1s 计数一次。0.1的二进制数是一个无限循环序列:0.00011[0011]...(方括号中的序列是无限循环的)。假定系统用一个float型的变量 x\displaystyle x 表示0.1,尾数采用就近舍入方式,则变量 x\displaystyle x 在机器中的表示是( )。
A. 3D3CCCCH    B. 3D3CCCCDH    C. 3B3CCCCH    D. 3B3CCCCDH
查看答案与解析

答案: B(题面十六进制选项存在排版错误,标准机器数应为 3DCCCCCDH)

解析: 十进制数 0.1\displaystyle 0.1 的二进制表示为无限循环小数:

0.1=0.00011001100112\displaystyle 0.1=0.0001100110011\cdots_2

规格化后为:

1.10011001100112×24\displaystyle 1.1001100110011\cdots_2\times2^{-4}

因此:

  • 符号位 S=0\displaystyle S=0
  • 实际阶码为 4\displaystyle -4,阶码字段为 4+127=123=011110112\displaystyle -4+127=123=01111011_2
  • 尾数字段为循环的 100110011001...,按就近舍入后末位进 1。

得到 32 位机器数:

Text
0 01111011 10011001100110011001101

转换为十六进制为:

3DCCCCCDH\displaystyle \mathrm{3DCCCCCDH}

原题各选项存在字符排版异常;按其意图,应选择最接近标准结果的 B。


  1. 【王道·卷八-Q13】C\displaystyle C 语言中,若有如下定义:
C
int a = 5; b = 8;
float x = 4.2, y = 3.4;

则表达式 (float)(a+b)/2+(int)x%(int)y\displaystyle (float)(a + b) / 2 + (int)x\%(int)y 的值是( )。

A. 7.500000    B. 7    C. 7.000000    D. 8
查看答案与解析

答案: A

解析: 按题意将 a\displaystyle ab\displaystyle b 均视为 int 型变量。

第一部分:

(float)(a+b)/2=(float)13/2=13.0/2=6.5\displaystyle (float)(a+b)/2=(float)13/2=13.0/2=6.5

因为 a+b\displaystyle a+b 被强制转换为 float,所以这里进行的是浮点除法,而不是整数除法。

第二部分:

(int)x%(int)y=4%3=1\displaystyle (int)x\%(int)y=4\%3=1

整数 1 与浮点数 6.5 相加时会被转换为浮点数,因此:

6.5+1=7.5\displaystyle 6.5+1=7.5

表达式结果为浮点类型,按选项形式表示为 7.500000,选择 A。


  1. 【王道·卷八-Q16】 某台按字节编址的计算机采用小端方式存储,一维数组 a\displaystyle a 中有100个元素,其类型为float,存放在以地址C0001000H开始的连续区域中,则最后一个数组元素的MSB(最高有效字节)所在的地址应该是( )。
A. C0001396H    B. C0001399H    C. C000118CH    D. C000118FH
查看答案与解析

答案: D

解析: 一个 float 元素占 4B,数组共有 100 个元素,下标范围为 0~99。最后一个元素 a[99]\displaystyle a[99] 的首地址为:

C0001000H+99×4=C0001000H+396=C0001000H+18CH=C000118CH\displaystyle \begin{aligned} \mathrm{C0001000H}+99\times4 &=\mathrm{C0001000H}+396\\ &=\mathrm{C0001000H}+\mathrm{18CH}\\ &=\mathrm{C000118CH} \end{aligned}

小端方式中,最低有效字节存放在低地址,最高有效字节存放在高地址。因此 4B 数据的 MSB 位于首地址加 3 的位置:

C000118CH+3=C000118FH\displaystyle \mathrm{C000118CH}+3=\mathrm{C000118FH}

所以选择 D。

  • C 是最后一个元素的起始地址,即其最低有效字节所在地址。
  • A、B 的偏移量计算错误。

2.3.4 数据的宽度和存储

  1. 【王道·卷二-Q16】 某按字节编址的计算机已配有 00000H07FFFFH\displaystyle 00000H\sim 07FFFFH 的ROM区,MAR为20位,现用 16K×8\displaystyle 16K\times 8 位的RAM芯片构成剩下的RAM区 08000HFFFFFH\displaystyle 08000H\sim FFFFFH,则需要这样的RAM芯片( )片。
A. 61    B. 62    C. 63    D. 64
查看答案与解析

答案: B

解析: MAR 为 20 位,按字节编址,因此整个主存地址空间大小为:

220B=1MB=1024KB\displaystyle 2^{20}\mathrm{B}=1\mathrm{MB}=1024\mathrm{KB}

已配置的 ROM 地址范围为 00000H07FFFFH\displaystyle 00000H\sim07FFFFH,其容量为:

07FFFFH00000H+1=08000H=32KB\displaystyle \mathrm{07FFFFH}-\mathrm{00000H}+1 =\mathrm{08000H} =32\mathrm{KB}

因此剩余 RAM 区容量为:

1024KB32KB=992KB\displaystyle 1024\mathrm{KB}-32\mathrm{KB}=992\mathrm{KB}

每片 RAM 芯片的容量为:

16K×8=16KB\displaystyle 16K\times8\text{位}=16\mathrm{KB}

所需芯片数为:

992KB16KB=62\displaystyle \dfrac{992\mathrm{KB}}{16\mathrm{KB}}=62

因此选择 B。

注意地址 07FFFFH\displaystyle 07FFFFH 的最高有效十六进制位为 0,所以 ROM 区仅为 32KB,而不是 512KB。


  1. 【王道·卷三-Q17】 某计算机的主存地址位数为32位,按字节编址。L1 data Cache和L1 code Cache采用8路组相联方式,主存块大小为64B,采用回写(Write Back)方式和随机替换策略。两种Cache的数据区都是 32KB\displaystyle 32KB,L1 Cache总容量至少有( )。
A. 530K位    B. 531K位    C. 533K位    D. 534K位
查看答案与解析

答案: D

解析: 两个 Cache 的数据区均为 32KB\displaystyle 32KB,因此数据位总数为:

2×32KB×8=512K\displaystyle 2\times 32KB\times 8=512K\text{位}

对每个 Cache,主存块大小为 64B=26B\displaystyle 64B=2^6B,故块内地址占 6 位。每个 Cache 的数据块数为:

32KB64B=512=29\displaystyle \dfrac{32KB}{64B}=512=2^9

采用 8 路组相联,每组 8 块,因此组数为:

5128=64=26\displaystyle \dfrac{512}{8}=64=2^6

组号占 6 位,主存地址共 32 位,所以标记位数为:

3266=20\displaystyle 32-6-6=20\text{位}

L1 data Cache 采用回写法,每个 Cache 行除 20 位标记外,还需要 1 位有效位和 1 位脏位:

512×(20+1+1)=11264=11K\displaystyle 512\times(20+1+1)=11264\text{位}=11K\text{位}

L1 code Cache 只用于取指,通常不发生写回,因此每行只需标记位和有效位:

512×(20+1)=10752=10.5K\displaystyle 512\times(20+1)=10752\text{位}=10.5K\text{位}

因而总容量至少为:

512K+11K+10.5K=533.5K\displaystyle 512K+11K+10.5K=533.5K\text{位}

至少需要按整 K 位计为 534K\displaystyle 534K 位,选择 D。随机替换不需要额外保存 LRU 替换状态,这是题目特别说明随机替换策略的原因。


  1. 【王道·卷五-Q16】 假定主存地址位数为32位,按字节编址,主存和Cache之间采用全相联映射方式,主存块大小为1字,字32位,采用回写(Write Back)方式和随机替换策略,则能存放32K字数据的Cache的总容量至少应有( )位。
A. 1536K    B. 1568K    C. 2016K    D. 2048K
查看答案与解析

答案: D

解析: 主存块大小为 1 字,每字 32 位,即:

1=4B=22B\displaystyle 1\text{字}=4B=2^2B

因为按字节编址,所以块内地址占 2 位。采用全相联映射,不需要组号或行号字段,因此标记位数为:

322=30\displaystyle 32-2=30\text{位}

Cache 能存放 32K\displaystyle 32K 字数据,且每块恰好 1 字,所以共有 32K\displaystyle 32K 个 Cache 行。每行包括:

  • 数据位:32 位;
  • 标记位:30 位;
  • 有效位:1 位;
  • 脏位:1 位。

随机替换策略不需要 LRU 状态位。因此每行总位数为:

32+30+1+1=64\displaystyle 32+30+1+1=64\text{位}

Cache 总容量至少为:

32K×64=2048K\displaystyle 32K\times64=2048K\text{位}

所以选择 D。


  1. 【王道·卷六-Q15】 某计算机的主存大小为 8GB\displaystyle 8GB,按字节编址,主存块大小为 64B\displaystyle 64B,Cache数据区为 64KB\displaystyle 64KB。若Cache采用8路组相联方式,则Cache中比较器的个数为( ),一个主存地址在Cache中比较的总次数为( ),若Cache采用直接映射方式,则Cache中比较器的个数为( ),一个主存地址在Cache中比较总次数为( )。
A. 1,1,1,1    B. 8,8,512,512    C. 8,8,1,1    D. 8,8,512,1
查看答案与解析

答案: C

解析:k\displaystyle k 路组相联 Cache 中,一个主存块只能映射到指定组内的 k\displaystyle k 个 Cache 行。查询时,需要将主存地址的标记同时与该组内 k\displaystyle k 个标记进行比较,因此通常配置 k\displaystyle k 个比较器。

本题采用 8 路组相联,所以:

  • 比较器个数为 8;
  • 一个主存地址需要与组内 8 个标记比较,总比较次数为 8。

直接映射中,一个主存块只能映射到唯一的 Cache 行,只需将地址标记与该行标记比较一次,因此:

  • 比较器个数为 1;
  • 总比较次数为 1。

故四个空依次为 8,8,1,1\displaystyle 8,8,1,1,选择 C。

选项 B、D 将直接映射误认为需要在大量 Cache 行之间查找。实际上直接映射可由地址中的行号直接定位目标行,无须遍历比较。


  1. 【王道·卷七-Q15】 在页面尺寸为4KB的页式存储器中,按字节编址,页表中的内容如下图所示,则物理地址32773对应的逻辑地址为( )。(本题中的所有数字均为十进制数。)
虚页号页框号有效位虚页号页框号有效位
021381
111470
270511
A. 32773    B. 42773    C. 12293    D. 62773
查看答案与解析

答案: C

解析: 页面大小为 4KB=4096B\displaystyle 4KB=4096B。将物理地址 32773 分解为页框号与页内偏移:

32773=8×4096+5\displaystyle 32773=8\times4096+5

因此:

  • 页框号为 8;
  • 页内偏移为 5。

查页表可知,虚页号 3 映射到页框号 8,且有效位为 1。因此对应逻辑地址为:

3×4096+5=12293\displaystyle 3\times4096+5=12293

所以选择 C。

A 将物理地址直接作为逻辑地址;其余选项均未按“虚页号乘页面大小再加页内偏移”的规则计算。


  1. 【竟成·模拟五-14】 某计算机采用大端存储方式并按照字节编址,int型数组a在内存中连续存储,其在该计算机内存中首地址为12340000H,若a[1]中存储的数为00011234H,则12340005H中的存储内容为()。
A. 12H    B. 21H    C. 01H    D. 10H
查看答案与解析

答案: C

解析: int 型数据占 4B。数组首地址为 12340000H,因此第二个元素 a[1]\displaystyle a[1] 的起始地址为:

12340000H+4=12340004H\displaystyle 12340000H+4=12340004H

a[1]\displaystyle a[1] 的值为 00011234H,按字节拆分为:

Text
00H 01H 12H 34H

大端方式将最高有效字节存放在最低地址,因此各地址内容为:

地址内容
12340004H00H
12340005H01H
12340006H12H
12340007H34H

所以 12340005H 中存放 01H,选择 C。


  1. 【竟成·模拟六-13】 某32位计算机按字节编址,采用小端方式存放数据,有一个IEEE754单精度浮点格式表示的数,其值为(4.25)×217\displaystyle (-4.25)\times2^{17},存放在FFFFC000H开始的连续存储单元中,则存储单元FFFFC002H中存放的是()。
A. C9H    B. 08H    C. 00H    D. 20H
查看答案与解析

答案: B

解析: 先将数值规格化:

4.25=(100.01)2=(1.0001)2×22\displaystyle 4.25=(100.01)_2=(1.0001)_2\times2^2

因此:

(4.25)×217=(1.0001)2×219\displaystyle (-4.25)\times2^{17}=-(1.0001)_2\times2^{19}

IEEE 754 单精度格式中:

  • 符号位为 1;
  • 阶码真值为 19,移码为 19+127=146=(10010010)2\displaystyle 19+127=146=(10010010)_2
  • 尾数字段为 00010000000000000000000。

组合得到 32 位机器码:

Text
1 10010010 00010000000000000000000

写成十六进制为:

Text
C9 08 00 00

小端方式按“低有效字节存低地址”存放,因此:

地址内容
FFFFC000H00H
FFFFC001H00H
FFFFC002H08H
FFFFC003HC9H

所以 FFFFC002H 中存放 08H,选择 B。


  1. 【竟成·模拟六-14】 假设某计算机采用小端方式存储,按字节编址。某一维数组有100个元素,类型为float,存放在地址以C0001000H开始的连续区域中,则最后一个数组元素的最高有效位(MSB)所在的地址应为()。
A. C0001100H    B. C0001403H    C. C000118FH    D. C0001193H
查看答案与解析

答案: C

解析: 一个 float 元素占 4B,最后一个元素为 a[99]\displaystyle a[99],其首地址为:

C0001000H+99×4=C0001000H+396=C0001000H+18CH=C000118CH\displaystyle \begin{aligned} \mathrm{C0001000H}+99\times4 &=\mathrm{C0001000H}+396\\ &=\mathrm{C0001000H}+\mathrm{18CH}\\ &=\mathrm{C000118CH} \end{aligned}

小端方式中,最低有效字节位于最低地址,最高有效字节位于最高地址。因此该 4B 元素的 MSB 所在地址为:

C000118CH+3=C000118FH\displaystyle \mathrm{C000118CH}+3=\mathrm{C000118FH}

所以选择 C。