1. 信息表示¶
章节导引
本页从《计算机系统基础讲义》拆分而来,保留原章节锚点,方便从旧总览页和旧链接跳转。
学习目标¶
理解同一串比特如何因解释方式不同而表示不同数据,并能处理整数/浮点常见边界。
前置知识¶
基础代数、二进制直觉,以及能阅读简单程序变量。
建议用时¶
建议 5–7 小时:整数 2 小时,补码 1–2 小时,浮点 2–3 小时。
练习建议¶
完成 5 个进制转换、3 个补码求值、2 个浮点特殊值判断,并解释大小端差异。
参考资料与引用边界¶
- 整理者:Lumner。
- 课程来源:根据
SYS/目录下的课件整理;本章对应课件:SYS/Lec01-Information Representation.pptx。 - 原始讲义文件:
note/SYS_计算机系统基础讲义.md。 - 引用边界:这是公开学习笔记,不替代课程正式教材、教师课件或考试要求;外部引用时请注明来自本网站整理版。
1.1 信息、信号与二值抽象¶
计算机内部无法直接处理“文字、图像、声音、视频、结构化对象”这些高级信息。它们必须被编码成二进制数据,再由硬件按照 0 和 1 的规则处理。
数字系统中使用二值信号,是因为它把连续物理世界压缩成离散判断:
- 电压可以表示 0/1,例如低电压表示 0,高电压表示 1。
- 磁场方向、光盘坑面反射、DRAM 电荷量等也可以表示 0/1。
- 只要输入电压落在合法低电平或高电平范围内,逻辑电路就能忽略一定程度的噪声。
信号按时间和值域可以粗略分为:
| 信号类型 | 值域 | 时间 | 例子 |
|---|---|---|---|
| 模拟信号 | 连续 | 连续 | 音频电压波形 |
| 异步数字信号 | 离散 | 连续 | 未统一采样的开关信号 |
| 同步数字信号 | 离散 | 离散 | 时钟边沿采样的寄存器输入 |
1.2 外部信息与内部数据¶
从用户和高级程序员角度看,信息可以是文本、图像、声音、视频、图、树、链表、队列等;从机器内部看,基本数据主要分成:
- 数值数据:无符号整数、有符号整数、定点数、浮点数。
- 非数值数据:逻辑值、字符、字符串、媒体编码、结构化数据的地址关系。
课程中的关键思想是:同一串比特没有天然含义,含义来自解释方式。例如 11111111 可以是无符号数 255,也可以是补码整数 -1,也可以是字符、颜色分量或机器指令的一部分。
1.3 进位计数制¶
任意正基数 r 的位置计数制可以写成:
其数值为:
其中每一位数字满足 0 <= A_i < r。
常见进制:
| 名称 | 基数 | 数字集合 |
|---|---|---|
| 二进制 | 2 | 0, 1 |
| 八进制 | 8 | 0 至 7 |
| 十进制 | 10 | 0 至 9 |
| 十六进制 | 16 | 0 至 9, A 至 F |
例子:
1.4 十进制到其他进制¶
整数部分使用“反复除基取余”:
- 用目标基数反复除整数部分。
- 每次保存余数。
- 余数倒序排列就是目标进制的整数部分。
例:135_10 转二进制:
135 / 2 = 67 ... 1
67 / 2 = 33 ... 1
33 / 2 = 16 ... 1
16 / 2 = 8 ... 0
8 / 2 = 4 ... 0
4 / 2 = 2 ... 0
2 / 2 = 1 ... 0
1 / 2 = 0 ... 1
135_10 = 10000111_2
小数部分使用“反复乘基取整”:
- 用目标基数反复乘小数部分。
- 每次保存整数位。
- 保存顺序就是目标进制的小数部分。
例:0.6875_10 转二进制:
0.6875 × 2 = 1.375 -> 1
0.375 × 2 = 0.75 -> 0
0.75 × 2 = 1.5 -> 1
0.5 × 2 = 1.0 -> 1
0.6875_10 = 0.1011_2
135.6875_10 = 10000111.1011_2
注意:很多十进制小数无法被有限二进制小数精确表示。例如 0.65_10 会产生循环二进制小数;因此机器必须截断或舍入。
1.5 二进制、八进制、十六进制互转¶
因为 8 = 2^3,16 = 2^4,所以:
- 二进制转八进制:从小数点向左右每 3 位分组,不足补 0。
- 二进制转十六进制:从小数点向左右每 4 位分组,不足补 0。
- 八进制或十六进制转二进制:每一位直接展开成 3 位或 4 位二进制。
例:
1.6 2 的幂与容量单位¶
计算机容量常用 2 的幂:
| 名称 | 二进制意义 | 数值 |
|---|---|---|
| K | 2^10 |
1024 |
| M | 2^20 |
1,048,576 |
| G | 2^30 |
1,073,741,824 |
| T | 2^40 |
1,099,511,627,776 |
注意区分:
- 内存容量常按
KiB = 2^10 bytes的传统语义使用。 - 网络速率常按十进制使用,例如
1 Mb/s = 10^6 bit/s。
1.7 定点整数表示¶
机器数是计算机内部编码,真值是该编码所表示的数学值。对于 n 位无符号整数:
有符号整数常见表示方式包括:
| 表示法 | 思想 | 0 的表示 | 运算便利性 |
|---|---|---|---|
| 原码 sign-magnitude | 最高位表示符号,其余位表示绝对值 | +0 和 -0 两种 | 加减复杂 |
| 反码 one's complement | 负数为正数逐位取反 | +0 和 -0 两种 | 比原码好,但仍有双零 |
| 补码 two's complement | 负数为反码加 1 | 只有一个 0 | 最适合硬件加减 |
| 移码 biased notation | 真值加偏置后编码 | 常用于浮点指数 | 便于比较指数 |
补码是现代计算机整数的核心表示。n 位补码范围为:
例如 32 位补码范围是:
1.8 补码求负与符号扩展¶
补码求负的基本公式:
另一种手算方法:
- 从最低位开始复制所有连续的 0。
- 复制遇到的第一个 1。
- 更高位全部取反。
符号扩展用于把较短的有符号数放入较长寄存器:
8 位 +2: 0000 0010
32 位: 0000 0000 0000 0000 0000 0000 0000 0010
8 位 -2: 1111 1110
32 位: 1111 1111 1111 1111 1111 1111 1111 1110
扩展和截断规则:
| 操作 | 无符号数 | 有符号补码 |
|---|---|---|
| 扩展 | 高位补 0 | 符号扩展 |
| 截断 | 丢弃高位,相当于模 2^k |
丢弃高位后重新解释,可能改变符号和值 |
1.9 浮点数表示¶
浮点数用于表示很大、很小或带小数的数。IEEE 754 浮点数的数学形式:
其中:
s是符号位。M是尾数或有效数,规格化时通常满足1.0 <= M < 2.0。E是指数,通常使用移码表示。
单精度和双精度:
| 类型 | 总位数 | 符号位 | 指数位 | fraction 位 | 指数偏置 | 约十进制精度 |
|---|---|---|---|---|---|---|
| float | 32 | 1 | 8 | 23 | 127 | 约 7 位 |
| double | 64 | 1 | 11 | 52 | 1023 | 约 16 位 |
例:表示 -0.75:
1.10 IEEE 754 特殊值¶
指数全 0 和全 1 被保留作特殊用途:
| exp | frac | 含义 |
|---|---|---|
| 全 0 | 全 0 | +0 或 -0 |
| 全 0 | 非 0 | 非规格化数,允许逐渐下溢 |
| 非全 0/1 | 任意 | 规格化数 |
| 全 1 | 全 0 | +∞ 或 -∞ |
| 全 1 | 非 0 | NaN,表示非法或未定义结果 |
非规格化数的隐藏位是 0,而规格化数的隐藏位是 1。它牺牲精度换取更平滑的接近 0 的范围。
1.11 舍入与浮点运算陷阱¶
IEEE 754 的基本思想是:先计算精确结果,再舍入到目标精度。常见舍入模式:
| 模式 | 含义 |
|---|---|
| toward zero | 向 0 截断 |
| round down | 向 -∞ 舍入 |
| round up | 向 +∞ 舍入 |
| nearest even | 最接近,正好居中时选最低有效位为偶数的结果 |
默认通常是 round-to-nearest-even,因为它在统计上较少产生系统偏差。
浮点运算不等同于实数运算。例如加法可能不满足结合律:
原因是 y + z 中的 z 相对 y 太小,可能在对阶和舍入中丢失。
1.12 BCD、Gray Code 与 Excess-3¶
十进制数字也可以被二进制编码。常见编码:
| 编码 | 特点 |
|---|---|
| 8421 BCD | 每个十进制数字用 4 位表示,权值为 8、4、2、1 |
| Excess-3 | 在 BCD 值基础上加 3 |
| Gray Code | 相邻编码通常只改变 1 位,可降低转换时的毛刺风险 |
BCD 常用于需要精确十进制显示或金额处理的场景。它比纯二进制整数浪费空间,但更贴近十进制语义。
1.13 字符与非数值数据¶
ASCII 使用 7 位编码,包含:
- 10 个数字字符。
- 26 个大写字母。
- 26 个小写字母。
- 特殊可打印字符。
- 控制字符,如回车、退格等。
ASCII 的几个性质:
- 字符
'0'至'9'编码为0x30至0x39。 'A'至'Z'编码为0x41至0x5A。'a'至'z'编码为0x61至0x7A。- 大小写转换可以通过翻转特定位实现。
Unicode 扩展了字符编码范围,用于表示世界各语言文字。中文信息系统中还会涉及输入码、内码、字形码等层次。
1.14 数据宽度、字长与大小端¶
基本单位:
- bit:二进制位。
- byte:8 bit。
- word:机器自然处理的整数或地址大小,常见为 32 位或 64 位。
多字节数据在内存中的排列方式:
| 方式 | 低地址存放 | 高地址存放 | 例子 |
|---|---|---|---|
| Big Endian | 高字节 | 低字节 | 网络字节序、部分 PowerPC |
| Little Endian | 低字节 | 高字节 | x86、RISC-V |
例如 32 位数据 0x01234567 从地址 0x100 开始存放:
Big Endian:
0x100: 01
0x101: 23
0x102: 45
0x103: 67
Little Endian:
0x100: 67
0x101: 45
0x102: 23
0x103: 01