CSAPP 第二章:Information Representation and Processing

1. 信息存储 (Information Storage)

  • 字节(byte):最小的可寻址存储单元,通常是 8 bit。

  • 字(word):与计算机处理器位数相关,32 位机器字长为 4 字节,64 位为 8 字节。

  • 寻址方式:所有对象在内存中按 字节地址 编号。

  • 大小端模式

    • 大端 (Big-endian):高位字节存放在低地址。

    • 小端 (Little-endian):低位字节存放在低地址(x86 属于小端)。

📌 内存是字节序列,整数和指针等数据要考虑 字节序 (endianness)


2. 整数表示 (Integer Representation)

  1. 无符号整数 (Unsigned)

    • 采用二进制表示,范围:

      $0 \sim 2^w - 1$

      (w 为位数,例如 32 位无符号整数范围 0 ~ 2^32 - 1

  2. 有符号整数 (Signed)

    • 使用 二进制补码(Two’s Complement) 表示:

      • 最高位(MSB)作为符号位。

      • 正数:与无符号相同。

      • 负数:取反 + 1 得到补码。

    • 范围:

      $-2^{w-1} \sim 2^{w-1} - 1$

      (32 位有符号整数范围 -2147483648 ~ 2147483647

  3. 补码的好处

    • 加减法运算与无符号一致(硬件实现简单)。

    • 只有一个零(不像反码/原码有 +0/-0 两种)。


3. 整数运算 (Integer Arithmetic)

  1. 溢出 (Overflow)

    • 无符号整数溢出:模 $2^w$。

    • 有符号整数溢出:结果超出范围会回绕。

    • C 语言中:

      • 无符号溢出:定义良好,取模结果。

      • 有符号溢出:未定义行为(但实际硬件一般是补码溢出)。

  2. 扩展 (Casting / Conversion)

    • 无符号 → 有符号:可能导致负数。

    • 有符号 → 无符号:可能变成大数。

    • 拓展位数

      • 无符号:高位补 0

      • 有符号:高位补符号位。

  3. 截断 (Truncation)

    • 从大整数类型转为小整数类型时,会保留低位,丢弃高位。

4. 浮点数表示 (Floating Point Representation)

基于 IEEE 754 标准
一个浮点数由三部分组成:

  • 符号位 (sign):1 bit

  • 阶码 (exponent):偏置存储

  • 尾数/小数部分 (fraction/mantissa)

形式:

$$V = (-1)^s \times M \times 2^E$$

  • 规格化数 (Normalized)

    • 隐含的最高位 1
  • 非规格化数 (Denormalized)

    • 用于表示非常接近 0 的数,解决“精度间隙”问题。
  • 特殊值

    • exp = all 1, frac = 0 → ±∞

    • exp = all 1, frac ≠ 0 → NaN

📌 由于尾数有限,浮点数 不是精确表示所有实数,会出现舍入误差。


5. 浮点数运算 (Floating Point Arithmetic)

  1. 舍入 (Rounding)

    • 默认是“就近舍入,平分取偶数 (round to even)”。
  2. 精度与误差

    • 浮点加法、乘法 不满足结合律

    • $((a+b)+c) \neq (a+(b+c))$,数值结果可能不同。

    • 规格化数 (Normalized)

      • 形式:$x = (-1)^s \times 1.f \times 2^E$
      • 尾数首位隐含 1,精度最高(float32 有效位 24 位)
    • 非规格化数 (Denormalized)

      • 形式:$x = (-1)^s \times 0.f \times 2^{E_\min}$
      • 尾数首位显式 0,精度比规格化数少 1 位
      • 用于表示接近 0 的极小数,避免下溢直接为 0
  3. 浮点比较

    • 存在 NaN,与任何数比较都返回 false(包括 NaN == NaN)。

🔑 本章关键点

  1. 所有数据本质都是比特串,存放在内存中

  2. 整数用补码,浮点数用 IEEE 754

  3. 溢出、舍入、截断 都是程序错误的常见来源

  4. 理解数据表示 → 才能正确分析程序的行为,避免 bug


CSAPP 第二章:Information Representation and Processing
http://example.com/2025/09/03/chapter-data/
Author
Newtown
Posted on
September 3, 2025
Licensed under