跳转至
跳转到正文

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 的位置计数制可以写成:

(A_{n-1} A_{n-2} ... A_1 A_0 . A_{-1} A_{-2} ... A_{-m})_r

其数值为:

Σ A_i × r^i

其中每一位数字满足 0 <= A_i < r

常见进制:

名称 基数 数字集合
二进制 2 0, 1
八进制 8 0 至 7
十进制 10 0 至 9
十六进制 16 0 至 9, A 至 F

例子:

(100101.01)_2
= 1×2^5 + 0×2^4 + 0×2^3 + 1×2^2 + 0×2^1 + 1×2^0 + 0×2^-1 + 1×2^-2
= (37.25)_10
(3A.C)_16
= 3×16^1 + 10×16^0 + 12×16^-1
= (58.75)_10

1.4 十进制到其他进制

整数部分使用“反复除基取余”:

  1. 用目标基数反复除整数部分。
  2. 每次保存余数。
  3. 余数倒序排列就是目标进制的整数部分。

例: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

小数部分使用“反复乘基取整”:

  1. 用目标基数反复乘小数部分。
  2. 每次保存整数位。
  3. 保存顺序就是目标进制的小数部分。

例: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^316 = 2^4,所以:

  • 二进制转八进制:从小数点向左右每 3 位分组,不足补 0。
  • 二进制转十六进制:从小数点向左右每 4 位分组,不足补 0。
  • 八进制或十六进制转二进制:每一位直接展开成 3 位或 4 位二进制。

例:

(2B.5E)_16 = 0010 1011 . 0101 1110_2
(1001101.01101)_2 = 0100 1101 . 0110 1000_2 = (4D.68)_16

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 <= X <= 2^n - 1

有符号整数常见表示方式包括:

表示法 思想 0 的表示 运算便利性
原码 sign-magnitude 最高位表示符号,其余位表示绝对值 +0 和 -0 两种 加减复杂
反码 one's complement 负数为正数逐位取反 +0 和 -0 两种 比原码好,但仍有双零
补码 two's complement 负数为反码加 1 只有一个 0 最适合硬件加减
移码 biased notation 真值加偏置后编码 常用于浮点指数 便于比较指数

补码是现代计算机整数的核心表示。n 位补码范围为:

-2^(n-1) <= X <= 2^(n-1)-1

例如 32 位补码范围是:

-2,147,483,648 到 2,147,483,647

1.8 补码求负与符号扩展

补码求负的基本公式:

-x = ~x + 1

另一种手算方法:

  1. 从最低位开始复制所有连续的 0。
  2. 复制遇到的第一个 1。
  3. 更高位全部取反。

符号扩展用于把较短的有符号数放入较长寄存器:

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 浮点数的数学形式:

(-1)^s × M × 2^E

其中:

  • 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

-0.75 = (-1)^1 × 1.1_2 × 2^-1
s = 1
frac = 1000...
single exponent = -1 + 127 = 126 = 01111110_2

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,因为它在统计上较少产生系统偏差。

浮点运算不等同于实数运算。例如加法可能不满足结合律:

x = -1.5 × 10^38
y =  1.5 × 10^38
z =  1.0

x + (y + z) = 0.0
(x + y) + z = 1.0

原因是 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' 编码为 0x300x39
  • 'A''Z' 编码为 0x410x5A
  • 'a''z' 编码为 0x610x7A
  • 大小写转换可以通过翻转特定位实现。

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