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)
无符号整数 (Unsigned)
采用二进制表示,范围:
$0 \sim 2^w - 1$
(w 为位数,例如 32 位无符号整数范围
0 ~ 2^32 - 1
)
有符号整数 (Signed)
使用 二进制补码(Two’s Complement) 表示:
最高位(MSB)作为符号位。
正数:与无符号相同。
负数:取反 + 1 得到补码。
范围:
$-2^{w-1} \sim 2^{w-1} - 1$
(32 位有符号整数范围
-2147483648 ~ 2147483647
)
补码的好处
加减法运算与无符号一致(硬件实现简单)。
只有一个零(不像反码/原码有 +0/-0 两种)。
3. 整数运算 (Integer Arithmetic)
溢出 (Overflow)
无符号整数溢出:模 $2^w$。
有符号整数溢出:结果超出范围会回绕。
C 语言中:
无符号溢出:定义良好,取模结果。
有符号溢出:未定义行为(但实际硬件一般是补码溢出)。
扩展 (Casting / Conversion)
无符号 → 有符号:可能导致负数。
有符号 → 无符号:可能变成大数。
拓展位数:
无符号:高位补
0
。有符号:高位补符号位。
截断 (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)
舍入 (Rounding)
- 默认是“就近舍入,平分取偶数 (round to even)”。
精度与误差
浮点加法、乘法 不满足结合律。
$((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
浮点比较
- 存在
NaN
,与任何数比较都返回 false(包括NaN == NaN
)。
- 存在
🔑 本章关键点
所有数据本质都是比特串,存放在内存中
整数用补码,浮点数用 IEEE 754
溢出、舍入、截断 都是程序错误的常见来源
理解数据表示 → 才能正确分析程序的行为,避免 bug