计算机系统 I | Sec 01-3
一、数值数据的表示
1. 无符号与有符号整数
- 等价性 (Equivalence):非负数值的编码在无符号和补码(Two's Complement)中是相同的。
- 单值性 (Uniqueness):
- 每个位模式代表唯一的整数值。
- 每个可表示的整数有唯一的位编码。
- 这意味着映射是可逆的:
, 。
- 示例对比 (4位):
0000~0111(0-7):无符号和有符号表示相同。1000~1111:无符号表示为 8-15;有符号(补码)表示为 -8 ~ -1。
2. 符号扩展 (Sign Extension)
- 任务:将
位有符号整数转换为 位,保持数值不变。 - 规则:复制
份符号位(最高有效位 MSB)到高位。 - 公式:
( 个 MSB)。
- 公式:
3. 乘法运算示例
- 演示了二进制乘法的位移和相加过程。
- 负数乘法:通过补码进行,注意符号位的处理及结果的正确性(如
)。
二、定点数与浮点数基础
1. 定点数表示 (Fixed-point)
- 原理:小数点隐含在
位编码的固定位置。 - 局限性:
- 近似表示:只能精确表示形如
的数值。其他有理数(如 1/3, 1/5, 1/10)会有无限循环的二进制表示。 - 范围限制:有限的位数限制了能表示的数值范围(非常大或非常小的数难以表示)。
- 灵活性差:无法动态调整小数点位置以适应不同量级的数据(如 123.456)。
- 近似表示:只能精确表示形如
2. 浮点数表示 (Floating-point)
- 核心思想:对形如
的有理数进行编码,适合表示极大或极小的数。 - IEEE 754 标准:
- 由 William Kahan 设计,1985年确立,成为统一标准。
- 支持所有主流 CPU,定义了优雅的舍入、溢出和下溢处理机制。
IEEE 754 编码结构
数值形式:
(Sign):符号位,0为正,1为负。 (Significand):尾数,通常是 范围内的二进制小数。 (Exponent):阶码,权重为 。 - 字段:
s:1位。exp:阶码字段(编码,但不等于 )。 frac:小数字段(编码,但不等于 )。
精度格式
| 类型 | 总位数 | s | exp (位) | frac (位) | Bias |
|---|---|---|---|---|---|
| 单精度 (Single) | 32 | 1 | 8 | 23 | 127 |
| 双精度 (Double) | 64 | 1 | 11 | 52 | 1023 |
| 扩展精度 | 80 (Intel) | 1 | 15 | 64 | 16383 |
三种数值情况
规格化数 (Normalized Values)
- 条件:
exp不全为0且不全为1。 - 阶码:
(偏置表示法,便于比较大小)。 - 尾数:
(隐含前导1,增加一位精度)。 - 范围:单精度
。
- 条件:
非规格化数 (Denormalized Values)
- 条件:
exp全为0。 - 目的:解决“突然式下溢出”,填补最小规格化数与0之间的巨大空隙,实现“渐进式下溢出”。
- 阶码:
。 - 尾数:
(隐含前导0)。 - 特殊情况:若
frac也为0,则表示 0(有 +0 和 -0 之分)。
- 条件:
特殊值 (Special Values)
- 条件:
exp全为1。 - 无穷大 (
): frac全为0。表示溢出运算结果(如)。 - 非数 (NaN):
frac不全为0。表示未定义的运算结果(如, )。
- 条件:
浮点数分布特性
- 数值越接近0,分布越密集;数值越大,分布越稀疏。
- 非规格化数确保了从最小正数到0的平滑过渡。
三、浮点数运算与性质
1. 基本运算思想
- 加减法:对阶 -> 尾数加减 -> 规格化 -> 舍入。
- 乘法:符号异或,尾数相乘,阶码相加 -> 规格化 -> 舍入。
- 舍入 (Rounding):
- 向偶数舍入 (Round-to-Even):默认模式。当数值恰好在两个可表示值中间时,舍入到最低有效位为偶数的那个值。这能减少统计偏差。
- 其他模式:向零、向下、向上(用于计算边界)。
2. 数学性质(与实数算术的区别)
- 封闭性:不封闭(可能产生
或 NaN)。 - 结合律:不满足。
- 例:
,但 。
- 例:
- 分配律:不满足。
- 例:
,但 (因溢出)。
- 例:
- 单调性:基本满足(除
和 NaN 外)。
3. C语言中的浮点数
- 类型:
float(单精度),double(双精度)。 - 转换:
double/float->int:截断小数部分(向零舍入),溢出或未定义时通常设为TMin。int->double:若int位数,可精确转换。 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字节,寻址空间巨大 (理论
)。
- 容量单位:
- 二进制前缀 (IEC标准):KiB (
), MiB ( ), GiB ( )... - 十进制前缀 (硬盘厂商标注):KB (
), MB ( )...
- 二进制前缀 (IEC标准):KiB (
2. C语言数据类型大小 (典型)
| 类型 | 32-bit | x86-64 |
|---|---|---|
char | 1 | 1 |
short | 2 | 2 |
int | 4 | 4 |
long | 4 | 8 |
long long | 8 | 8 |
float | 4 | 4 |
double | 8 | 8 |
pointer | 4 | 8 |
3. 字节序 (Byte Ordering)
- 大端模式 (Big Endian):最高有效字节存放在最低地址 (Sun, PPC, 网络协议)。
- 例:
0x01234567存储为01 23 45 67。
- 例:
- 小端模式 (Little Endian):最低有效字节存放在最低地址 (x86, x86-64)。
- 例:
0x01234567存储为67 45 23 01。
- 例:
- 注意:字节序仅针对多字节数据在内存中的排列,不影响单个字节内部的比特序。
六、总结
计算机系统通过二进制位模式表示各种数据。理解整数(补码)、浮点数(IEEE 754)的编码细节、运算特性(特别是舍入和非结合性)以及非数值数据(字符、字节序)的表示方法,对于编写正确、高效的程序以及避免严重的数值错误至关重要。