Skip to content

计算机系统 I | Sec 01-3

课件和翻译整理

一、数值数据的表示

1. 无符号与有符号整数

  • 等价性 (Equivalence):非负数值的编码在无符号和补码(Two's Complement)中是相同的。
  • 单值性 (Uniqueness)
    • 每个位模式代表唯一的整数值。
    • 每个可表示的整数有唯一的位编码。
    • 这意味着映射是可逆的:U2B(x)=B2U1(x)T2B(x)=B2T1(x)
  • 示例对比 (4位)
    • 0000 ~ 0111 (0-7):无符号和有符号表示相同。
    • 1000 ~ 1111:无符号表示为 8-15;有符号(补码)表示为 -8 ~ -1。

2. 符号扩展 (Sign Extension)

  • 任务:将 w 位有符号整数转换为 w+k 位,保持数值不变。
  • 规则:复制 k 份符号位(最高有效位 MSB)到高位。
    • 公式:X=xw1,,xw1,xw1,xw2,,x0k 个 MSB)。

3. 乘法运算示例

  • 演示了二进制乘法的位移和相加过程。
  • 负数乘法:通过补码进行,注意符号位的处理及结果的正确性(如 7×4=28)。

二、定点数与浮点数基础

1. 定点数表示 (Fixed-point)

  • 原理:小数点隐含在 w 位编码的固定位置。
  • 局限性
    • 近似表示:只能精确表示形如 x/2k 的数值。其他有理数(如 1/3, 1/5, 1/10)会有无限循环的二进制表示。
    • 范围限制:有限的位数限制了能表示的数值范围(非常大或非常小的数难以表示)。
    • 灵活性差:无法动态调整小数点位置以适应不同量级的数据(如 123.456)。

2. 浮点数表示 (Floating-point)

  • 核心思想:对形如 V=M×2E 的有理数进行编码,适合表示极大或极小的数。
  • IEEE 754 标准
    • 由 William Kahan 设计,1985年确立,成为统一标准。
    • 支持所有主流 CPU,定义了优雅的舍入、溢出和下溢处理机制。

IEEE 754 编码结构

数值形式:(1)s×M×2E

  • s (Sign):符号位,0为正,1为负。
  • M (Significand):尾数,通常是 [1.0,2.0) 范围内的二进制小数。
  • E (Exponent):阶码,权重为 2E
  • 字段
    • s:1位。
    • exp:阶码字段(编码 E,但不等于 E)。
    • frac:小数字段(编码 M,但不等于 M)。

精度格式

类型总位数sexp (位)frac (位)Bias
单精度 (Single)321823127
双精度 (Double)64111521023
扩展精度80 (Intel)1156416383

三种数值情况

  1. 规格化数 (Normalized Values)

    • 条件exp 不全为0且不全为1。
    • 阶码E=ExpBias (偏置表示法,便于比较大小)。
    • 尾数M=1.frac (隐含前导1,增加一位精度)。
    • 范围:单精度 E[126,127]
  2. 非规格化数 (Denormalized Values)

    • 条件exp 全为0。
    • 目的:解决“突然式下溢出”,填补最小规格化数与0之间的巨大空隙,实现“渐进式下溢出”。
    • 阶码E=1Bias
    • 尾数M=0.frac (隐含前导0)。
    • 特殊情况:若 frac 也为0,则表示 0(有 +0 和 -0 之分)。
  3. 特殊值 (Special Values)

    • 条件exp 全为1。
    • 无穷大 ()frac 全为0。表示溢出运算结果(如 1.0/0.0)。
    • 非数 (NaN)frac 不全为0。表示未定义的运算结果(如 1, )。

浮点数分布特性

  • 数值越接近0,分布越密集;数值越大,分布越稀疏。
  • 非规格化数确保了从最小正数到0的平滑过渡。

三、浮点数运算与性质

1. 基本运算思想

  • 加减法:对阶 -> 尾数加减 -> 规格化 -> 舍入。
  • 乘法:符号异或,尾数相乘,阶码相加 -> 规格化 -> 舍入。
  • 舍入 (Rounding)
    • 向偶数舍入 (Round-to-Even):默认模式。当数值恰好在两个可表示值中间时,舍入到最低有效位为偶数的那个值。这能减少统计偏差。
    • 其他模式:向零、向下、向上(用于计算边界)。

2. 数学性质(与实数算术的区别)

  • 封闭性:不封闭(可能产生 或 NaN)。
  • 结合律不满足
    • 例:(3.14+1e10)1e10=0,但 3.14+(1e101e10)=3.14
  • 分配律不满足
    • 例:1e20×(1e201e20)=0,但 1e20×1e201e20×1e20=NaN (因溢出)。
  • 单调性:基本满足(除 和 NaN 外)。

3. C语言中的浮点数

  • 类型float (单精度), double (双精度)。
  • 转换
    • double/float -> int:截断小数部分(向零舍入),溢出或未定义时通常设为 TMin
    • int -> double:若 int 位数 53,可精确转换。
    • int -> float:可能需舍入。

4. 经典灾难案例

  • 爱国者导弹失败 (1991)
    • 原因:用24位浮点数近似表示0.1产生的累积误差。运行100小时后误差达0.34秒,导致拦截失败,28人死亡。
  • 阿丽亚娜5号火箭爆炸 (1996)
    • 原因:软件复用错误。将64位浮点数(水平速度)转换为16位有符号整数时发生溢出。火箭起飞37秒后自毁,损失5亿美元。

四、非数值数据表示

1. 十进制数的二进制编码 (BCD)

  • 8421码 (Weighted BCD):最常用的加权码,用4位二进制表示1位十进制 (0-9)。
    • 无效码字:1010 ~ 1111 (共6个)。
  • 非加权码:如余3码 (Excess-3)、格雷码 (Gray Code)。
    • 格雷码特点:相邻两个编码只有一位不同,常用于减少传输错误。

2. 字符编码

  • ASCII
    • 7位编码,包含94个可打印字符和34个控制字符。
    • 数字 '0'-'9':0x30-0x39。
    • 大写 'A'-'Z':0x41-0x5A;小写 'a'-'z':0x61-0x7A。
    • 大小写转换:翻转第6位 (bit 6)。
  • Unicode
    • 扩展 ASCII 以支持全球语言。
    • 常见实现:UTF-8 (变长,兼容ASCII,互联网最常用), UTF-16, UTF-32。
  • 汉字编码
    • 输入码 -> 机内码 (存储/处理,通常2字节,如GB2312) -> 字形码 (显示)。
    • 机内码 = 国标码 + 8080H (为了与ASCII区分,最高位设为1)。

3. 逻辑值

  • 形式上与数值数据相同(0/1序列),通过指令操作码区分(逻辑运算指令 vs 算术运算指令)。

五、数据宽度与存储

1. 数据单位

  • 位 (Bit):最小单位。
  • 字 (Word):CPU一次处理数据的自然单位(字长)。
    • 32位机器:字长4字节,寻址空间4GB。
    • 64位机器:字长8字节,寻址空间巨大 (理论 264)。
  • 容量单位
    • 二进制前缀 (IEC标准):KiB (210), MiB (220), GiB (230)...
    • 十进制前缀 (硬盘厂商标注):KB (103), MB (106)...

2. C语言数据类型大小 (典型)

类型32-bitx86-64
char11
short22
int44
long48
long long88
float44
double88
pointer48

3. 字节序 (Byte Ordering)

  • 大端模式 (Big Endian):最高有效字节存放在最低地址 (Sun, PPC, 网络协议)。
    • 例:0x01234567 存储为 01 23 45 67
  • 小端模式 (Little Endian):最低有效字节存放在最低地址 (x86, x86-64)。
    • 例:0x01234567 存储为 67 45 23 01
  • 注意:字节序仅针对多字节数据在内存中的排列,不影响单个字节内部的比特序。

六、总结

计算机系统通过二进制位模式表示各种数据。理解整数(补码)、浮点数(IEEE 754)的编码细节、运算特性(特别是舍入和非结合性)以及非数值数据(字符、字节序)的表示方法,对于编写正确、高效的程序以及避免严重的数值错误至关重要。