《深入理解计算机系统》信息的表示和处理
《深入理解计算机系统》第2章“信息的表示和处理”是全书的基础它揭示了计算机如何用二进制位表示现实世界中的数字、字符、指令等并解释了不同编码方式带来的数学特性和潜在陷阱。以下是对该章核心内容的梳理。1. 信息存储的基本单元与十六进制表示计算机将存储器视为一个巨大的字节数组每个字节由8个二进制位bit构成。由于二进制书写冗长常用十六进制09和AF来简记字节值例如0xAB0x \text{AB}0xAB对应二进制1010 10111010\ 101110101011。编译器和运行时系统将存储器划分为多个管理单元用于存放程序数据、指令和控制信息这些单元在虚拟地址空间中按字节编址。2. 整数的编码方式现实世界的整数在计算机中有三种主要编码无符号编码基于传统二进制只能表示非负整数0≤x≤2n−10 \leq x \leq 2^n-10≤x≤2n−1。补码编码用最高位为符号位0正1负能表示负数。例如32位补码的范围是−231∼231−1-2^{31} \sim 2^{31}-1−231∼231−1。浮点数编码采用以2为基数的科学计数法形如(−1)s×M×2E(-1)^s \times M \times 2^E(−1)s×M×2E但因有限位宽只能近似表示实数。C语言中的字面量有隐含类型规则。例如常量−2147483648-2147483648−2147483648其值0x800000000x800000000x80000000在32位机器上被视为unsigned int类型因为编译器按int→long→unsigned的顺序选择能容纳该值的类型。3. 数值溢出与运算的非直观性计算机的二进制位数量有限当计算结果超出当前类型的表示范围时会发生溢出overflow产生不可预期的结果。整数运算如加法、乘法在无符号和补码下基本满足交换律、结合律但浮点数运算不满足结合律因为舍入误差的存在会导致结果依赖于运算顺序。程序员必须了解这些特性才能写出跨平台、安全稳定的代码并防范通过数值溢出进行的黑客攻击。4. 字节顺序大端与小端多字节数据在内存中的存放顺序有两种大端Big Endian最高有效字节放在低地址。小端Little Endian最低有效字节放在低地址。判断方法可通过C语言代码取一个多字节整数的首字节若等于最高位字节则为大端否则为小端。不同机器和网络协议可能采用不同的字节序在数据传输和跨平台编程时需要做转换。