跳到主要内容
SUN / 笔记
← 全部文章

第三章

第一章

image-20251011105954261

image-20251011105939198

image-20251011110012056

image-20251011110028698

image-20251011110047680

image-20251011110103888

image-20251011110110951

image-20251011110121757

第二章

image-20251117104214276

已知 MIN_INT = 1000…0 MAX_INT = 0111…1 两者相加得到:

MIN_INT + MAX_INT = 1111…1 = −1(全 1,补码形式)

因此:

b ^ (MIN_INT + MAX_INT) = b ^ (−1) = b ^ (~0) = ~b

原式:

~( ~a | (b ^ (MIN_INT + MAX_INT)) ) = ~( ~a | ~b )

根据德摩根律:

~( ~a | ~b ) = a & b

所以结果是:

A. a & b

image-20251124182726627

总结精度: float:24 位有效二进制精度 double:53 位有效二进制精度 int(32 位):可精确表示到 ±2³¹−1,不超过 double 的精度范围

逐项分析:

A. (f + d) - f == d f 会提升为 double,然后进行 double 加法:

(double)f + d 会产生一次舍入误差,再减去 (double)f 后仍会保留这次舍入误差。 因此不一定等于 d。 不恒为真。

B. x == (int)(float)x float 只能精确表示到 2²⁴ = 16,777,216。 超过此范围的 int 转成 float 会丢失低位,再转回 int 会改变数值。 不恒为真。

C. x == (int)(double)x double 有 53 位有效精度,完全覆盖 32 位 int 的精度, 即 int → double → int 完全不会丢精度。 恒为真。

D. d == (double)(float)d double → float 会丢失精度(float 精度比 double 少),再转回 double 仍然不恢复原值。 不恒为真。

正确答案:C

image-20251124182936667

把 120 转成二进制:

120₁₀ = 0b 0111 1000

根据 8 位浮点格式:

  • 符号位:1 bit
  • 阶码:4 bit
  • 尾数:3 bit

字段划分: s | exp | frac 0 | 1111 | 000

其中:

  • exp = 1111 (全 1)
  • frac = 000

在 IEEE 浮点格式中:

  • exp = 全 1,frac = 000 → 无穷大(Infinity)
  • exp = 全 1,frac ≠ 000 → NaN

这里 frac = 000,因此表示 无穷大。

正确答案:B. 无穷大

image-20251124191348750

u >> 31 取的是最高位(第 31 位),再与 1 相与。

IEEE 754 单精度浮点数格式:

  • 符号位:bit31
  • 阶码:bit30–23
  • 尾数:bit22–0

因此 (u >> 31) & 0x1 取出的正是 符号位。

正确答案:B. 符号位

image-20251124193338839

A. 不同类编码不能进行运算 错误。计算机执行的是机器码,对应的数据类型由指令解释方式决定;同一比特模式在不同指令下也能被当作不同编码处理。

B. 浮点数编码只包含阶码和尾数两部分 错误。IEEE 浮点数包含 符号位 + 阶码 + 尾数 三部分。

C. 表示代码是指令编码,不同芯片体系和操作系统指令编码不同 正确。不同 指令集体系结构(ISA)(如 x86、ARM、RISC-V)对应的指令编码不同,因此表示代码也不同。

D. 表示字符串是 ASCII 编码的字符数组,串长度是数组长度 错误。C 字符串长度由 遇到 '\0' 为止 决定,不是数组总长度。

正确答案:C

image-20251124193413853

A. 无符号数除法是算术右移 错误。算术右移用于有符号数;无符号数右移使用 逻辑右移。并且右移只是除以 2 的幂次的特例,不是一般除法。

B. 无符号除以 2 的 k 次幂是无符号右移 k 位 正确。无符号数右移为逻辑右移,正好对应除以 2ᵏ(向下取整)。

C. 补码除以 2 的 k 次幂时加上偏置导致向偶数舍入 错误。加偏置(round toward +∞)通常用于“向上舍入”技巧,不是向偶数舍入。

D. 补码除以 2 的 k 次幂时导致向 0 舍入 错误。补码算术右移是向 负无穷(floor) 舍入,不是向 0 舍入。

例如: -3 >> 1 = -2(向下取整),而 -3/2 向 0 舍入应为 -1。

正确答案:B

image-20251124193842256

A. 通过无符号编码、补码编码、浮点数编码方式的二进制数 这是对“计算机中信息的表示”最准确的描述: 计算机内部统一以 二进制位模式 表示,不同编码方式(无符号、补码、浮点)只是解释方式不同。

B. 运算属性相同的三种编码二进制数 错误。三种编码的运算规则完全不同。

C. 无符号数、补码、浮点数 虽然接近,但这说的是“数的类型”,不是“表示方式本身”,且不是强调“二进制编码表示”。

D. 十六进制数和二进制数 错误。十六进制只是书写形式,不是存储或处理时的表示方式。

正确答案:A

image-20251124200256626

第一行:10 进制 188 188 → 二进制 = 1011 1100 188 → 十六进制 = 0xBC

第二行:二进制 11110011 11110011₂ → 十进制 = 243 243 → 十六进制 = 0xF3

第三行:十六进制 0xE7 E7₁₆ → 十进制 = 231 231 → 二进制 = 1110 0111

把所有结果整理:

(1)10111100 (2)0xBC (3)243 (4)0xF3 (5)231 (6)11100111

完全对应 A。

image-20251124201441297

无符号加法的溢出判断规律:

对于无符号数:

x + y 发生溢出 ⇔ 结果 s 小于任一操作数

原因:无符号加法在溢出时会模 2n2^n2n 回绕,导致结果变小。

因此正确条件是: s < x 或 s < y

选项 B

image-20251124202557430

题意关键是:w = 4 位补码,并且“补码非”指的是 按位取反(bitwise NOT),即:

补码非(x) = ~x (在 w 位补码下)

4 位补码可表示的范围: −8(1000) ~ +7(0111)

逐项分析:

A. 反码减一是补码非 错误。 “反码减 1 得补码”对应负数求补码,不是补码非的定义。 补码非是“逐位取反”,和“反码减一”无关。

B. -8 的逆元是 -8 错误。 -8 的补码为 1000 补码非:~1000 = 0111 = +7,不是 -8。

C. 8 的补码非是 -0 错误,因为 8 不在 4 位补码可表示范围内(最大是 7)。 因此“8 的补码非”这个说法本身就不存在。

D. 不存在 错误,因为 A、B、C 中已有错误项。


综上,哪一个是“错误”的? C 完全不成立,因为 8 不可表示,谈不上补码非。

正确答案:C

第三章

C递归程序如下:

long rfun (unsigned long x ){

if x==0

return 0 ;

unsigned long nx =(1);

long rv= rfun(nx);

return (2) ;

}

汇编代码如下:

1 rfun:

2 pushq %rbx

3 movq %rdi,%rbx

4 movl $0,%eax

5 testq %rdi, %rdi

6 je .L2

7 shrq $2,%rdi

8 call rfun

9 addq %rbx,%rax

10 .L2:

11 pop %rbx

12 ret

以下结论正确的是:( )

A.缺失表达式为:(1)x>>2,(2)rv

B.缺失表达式为:(1)x>>2,(2)x+rv

C.栈空间最多使用4字节

D.栈空间最多使用8字节

相关文章

lab说明 →Chapter 2 程序结构和执行 →CSAPP实验3:Attack →