2.4 溢出、BCD 与字符编码
上一节说明,同一个定长比特模式可以获得不同整数含义。本节继续追问两个相关问题:
1. 计算结果无法装入选定宽度时会发生什么?
2. 同一组比特如何表示十进制数字或文本,而不是二进制整数?
定长加法只保留可用比特
位寄存器只能保存 种模式。如果加法产生额外高位,寄存器无法保留它。
使用 4 位:
存回的结果是 0000,最前面的 1 作为最高位进位(carry out)报告。定长无符号算术因此按照模 工作:
这种回绕是有限宽度的确定结果。它是否可接受,要由计算目的决定。
进位与有符号溢出回答不同问题
进位标志(Carry Flag,CF)表示无符号结果需要额外高位。
溢出标志(Overflow Flag,OF)表示补码有符号结果超出有符号范围。
有符号加法在以下情况发生溢出:
- 两个非负操作数得到负的解码结果;
- 两个负操作数得到非负的解码结果。
异号操作数相加不会溢出,因为数学和位于二者之间。
观察 4 位模式:
| 比特模式加法 | 无符号解释 | 有符号解释 | CF | OF |
|---|---|---|---|---|
1111 + 0001 = 0000 | 1 | 0 | ||
0111 + 0001 = 1000 | 0 | 1 | ||
1000 + 1111 = 0111 | 1 | 1 | ||
0010 + 0011 = 0101 | 0 | 0 |
加法器产生的是同一组结果比特;采用哪种解释,决定软件应关注哪个标志。
实验 1——构造四种标志组合
把 4 位或 8 位操作数当作原始比特模式选择。实验会同时以无符号和补码方式解码每个操作数,并显示 CF 与 OF。
请完成全部四个任务,并把每个解法分别用无符号算术和有符号算术解释一次。
比特也可以编码十进制数字
二进制编码的十进制数(Binary-Coded Decimal,BCD)把每个十进制数字分别保存为一个 4 位二进制值。
十进制 59 被编码为:
组合后:
它不是数值 59 的普通二进制编码:
这里为了比较都显示为八位,但它们的分组含义不同。
合法 BCD 半字节从 0000 到 1001。1010 到 1111 这六个模式不能单独表示十进制数字。
当任务必须精确保留十进制数字时,例如某些金融、显示和传统接口场景,BCD 很有用。它的空间利用率低于纯二进制:一个十进制数字只有十种可能,却占用了具有十六种模式的 4 位空间。
字符编码把数值映射为符号
计算机也用数值保存文本。字符编码(character code)是数值代码与字符之间的共同约定。
ASCII 是一种基础的 7 位字符编码,通常保存在 8 位字节中。
| 字符 | 十进制代码 | 十六进制 | 8 位模式 |
|---|---|---|---|
A | 65 | 41 | 01000001 |
C | 67 | 43 | 01000011 |
0 | 48 | 30 | 00110000 |
5 | 53 | 35 | 00110101 |
字符 '5' 并不是数值整数 5:
如果软件用字符 '0' 的 ASCII 代码去减 '0' 到 '9' 的字符代码,就能得到对应数值数字。这个转换是程序操作,并不是存储器自动完成的性质。
现代文本使用 Unicode 覆盖许多书写系统,UTF-8 等编码再把 Unicode 码点转换为字节。本章只需掌握一般原则:接收方必须知道编码约定。
实验 2——修复 BCD 与 ASCII 传输
每个任务初始都有一位被翻转。请切换 BCD 半字节或 ASCII 字节,观察实时解码结果,并恢复目标消息。
修复后再故意翻转另一位,比较“产生非法 BCD 半字节”和“仍然合法但数字或字符悄悄改变”这两种错误。
表示元数据不可缺少
假设存储器中有 00110101。没有上下文时,它可能是:
- 无符号整数 53;
- 补码有符号整数 53;
- 两个 BCD 数字
3和5,表示十进制 35;
- ASCII 字符
'5';
- 机器指令或其他数据结构的一部分。
存储器保存比特,而不保存含义。正在执行的指令、软件选择的数据类型、设备协议与共同编码约定共同提供含义。
第 2 章总结
现在,你已经能够:
- 把位权数展开为各位贡献;
- 在二、八、十、十六进制之间转换;
- 区分无符号、符号-数值、反码与补码解释;
- 分别判断无符号进位和有符号溢出;
- 识别 BCD 数字和 ASCII 字符字节。
第 3 章将从“表示”转向“硬件逻辑”:逻辑门与真值表会说明电路如何变换这些比特模式。