主要参考《CHAPTER1 数制与编码》课件。页码均采用原课件页序;相关概念的适用条件与表述辨析见各节说明。
1. 本章内容与知识联系
数字电路通常以低电平与高电平表示两种逻辑状态。将两种状态分别记为 0 和 1,即构成二值符号系统。负数、字符与数制等意义由位串的解释规则确定。例如,寄存器中存储 01000001,按无符号数解释是 65,按 ASCII 解释是字符 A;存储的物理状态可以完全相同。
数值表示
位权、进制转换与二进制运算:建立数码序列与数值之间的对应关系。
有限字长
原码、反码、补码、定点数与溢出:分析固定位宽下的数值范围及算术规则。
信息编码
格雷码、BCD、ASCII与奇偶校验:分析不同信息表示与检错需求对应的编码方式。
本章各部分以“表示规则、计算方法、适用条件”三个方面相互联系。计算结果的解释须同时考虑位宽、符号约定与进位规则。格雷码的相邻性是第二章卡诺图排列的基础;BCD 的非法码组则为后续逻辑设计中的输入约束提供典型实例。
2. 基数、数码与位权
对应课件第 2–18 页。
十进制的 666 中,三个 6 的写法相同,贡献却分别是 600、60、6。数码本身只给出系数,所在位置给出倍率,这个倍率称为位权。位置计数法以数码表示相应单位的个数,并以数位位置确定单位的大小。
基数为 b 的计数制使用 b 个数码,数码的数值范围为 0 到 b−1。个位的位权为 b⁰=1,向左每移动一位乘 b,向右每移动一位除以 b。小数点左边第一位的位号为 0,右边第一位的位号为 −1。因此,基数决定进位规则,位置决定位权,数码决定该位取几个单位。
| 进制 | 基数 | 合法数码 | 常用下标 | 一位的最大值 |
|---|---|---|---|---|
| 二进制 | 2 | 0、1 | 2 或 B | 1 |
| 八进制 | 8 | 0–7 | 8 或 O | 7 |
| 十进制 | 10 | 0–9 | 10 或 D | 9 |
| 十六进制 | 16 | 0–9、A–F;A=10,…,F=15 | 16 或 H | 15 |
n 位无符号整数共有 bⁿ 种不同位串,最小值为 0,最大值为 bⁿ−1。例如 8 位二进制无符号数的范围是 0–255。该范围以“整数”和“无符号”为前提:若有小数位,或者最高位采用补码的负位权,范围必须重新计算。
例题:解释十六进制数 2A.C
A 的数值是 10,C 的数值是 12。按权展开:2×16¹+10×16⁰+12×16⁻¹=32+10+0.75=42.75。所以 (2A.C)₁₆=(42.75)₁₀。注意 C 只占一位,并不是十进制的两位“12”;小数点右边第一位也不是乘 16,而是除以 16。
注意事项:数码必须小于基数,(102)₂ 和 (89)₈ 都不是合法表示。写 10 而不标进制容易产生歧义;在 b 进制中,10 总表示十进制的 b。
自测题:四位八进制无符号整数的最大值是多少?为什么不是 8⁴?
参考解析
最大位串是 (7777)₈,值为 7(8³+8²+8+1)=8⁴−1=4095。共有 4096 个取值,但从 0 开始计数;4096 本身要写成五位的 (10000)₈。
3. 进制转换方法与精度
对应课件第 19–30 页。
3.1 任意进制到十进制:按权展开
任意进制数转换为十进制数,可直接按位权展开:将各数码的数值与对应位权相乘后求和。例如 (10110.101)₂=16+4+2+1/2+1/8=22.625。零位的贡献为零,可以不写,但不能因此改变其他位的位置。
手工计算时,可逐位标出位权,含连续零的小数尤其需要核对数位位置。核对结果也有直接方法:五位二进制整数必定小于 32;二进制小数部分必定小于 1。若结果不满足这些边界,往往是位号错位或漏掉小数点。
3.2 十进制整数到 b 进制:除 b 取余,倒序读取
整数 N 可以唯一写成 N=bq+r,且 0≤r<b。r 为个位数码,q 对应其余高位部分。对 q 再做相同操作,便依次得到从低位到高位的数码。因此,短除法按低位到高位的顺序产生余数,最终表示应按余数产生的逆序书写。
例题:把 37 转为二进制
| 被除数 | 除以 2 的商 | 余数 | 余数属于哪一位 |
|---|---|---|---|
| 37 | 18 | 1 | 2⁰ |
| 18 | 9 | 0 | 2¹ |
| 9 | 4 | 1 | 2² |
| 4 | 2 | 0 | 2³ |
| 2 | 1 | 0 | 2⁴ |
| 1 | 0 | 1 | 2⁵ |
商为 0 时结束,余数从下向上读取为 100101。复核:32+4+1=37。若题目要求 8 位无符号数,左边补零得到 00100101;补零是为了符合位宽,并不改变数值。
3.3 十进制小数到 b 进制:乘 b 取整,顺序读取
对 0≤f<1,乘 b 后得到 bf=a₋₁+f₁。整数部分 a₋₁ 是小数第一位,因为它原本乘的是 b⁻¹;把这一位去掉,再乘 b,得到第二位。每次乘基数均使下一小数位移至整数部分,因此各小数位按由高到低的顺序产生,按产生顺序书写。
例题:把 0.6875 转为二进制
- 0.6875×2=1.375,取整数 1,保留小数 0.375。
- 0.375×2=0.75,取整数 0,保留小数 0.75。
- 0.75×2=1.5,取整数 1,保留小数 0.5。
- 0.5×2=1.0,取整数 1,小数部分为 0,结束。
按先后顺序得到 (0.1011)₂。复核:1/2+1/8+1/16=11/16=0.6875。若原数为 37.6875,分别转换整数和小数后拼接,得到 100101.1011。
3.4 小数表示的有限性与量化误差
十进制的有限小数不一定是二进制有限小数。把一个有理数约成最简分数 p/q,它能在 b 进制中有限表示,当且仅当 q 的所有质因子均为 b 的质因子。因为有限的 b 进制小数一定可写成整数除以 bᵐ;反之,若 q 能整除某个 bᵐ,该数即可表示为 m 位 b 进制小数。二进制基数只有质因子 2,所以分母约分后只能含 2;1/10 的分母有 5,故 0.1 的二进制表示会循环。
保留 m 位二进制小数,相邻可表示数之间的间隔是 Δ=2⁻ᵐ。对正数直接截断相当于向下选格点,其误差满足 0≤x−x̂<2⁻ᵐ;对带负号的绝对值截断再还原负号,则向零逼近,绝对误差仍小于 2⁻ᵐ。若按最近值舍入,绝对误差不超过 2⁻⁽ᵐ⁺¹⁾。一般 b 进制的对应界分别是 b⁻ᵐ 与 b⁻ᵐ/2。
例题:0.323 保留四位二进制小数
连续乘 2 得到前五位 01010:0.323→0.646→1.292→0.584→1.168→0.336。前四位为 0101,第五位是 0,因此按最近值舍入仍为 (0.0101)₂=0.3125。实际绝对误差是 0.0105,小于半间隔 1/32=0.03125。该结果为近似表示,应使用“≈”而非精确等号。
对于课件中的 0.71:若要求结果小于原值且误差小于 0.005,8 位截断为 0.10110101=181/256=0.70703125,误差 0.00296875。7 位截断为 90/128=0.703125,误差 0.006875,因此本题最少 8 位。用 2⁻ᵐ<ε 可得到统一的充分保证;对某个指定数求“最少位数”,还应检查实际误差,不能只把充分条件当必要条件。
注意事项:整数余数倒序读,小数整数部分顺序读;前导零与小数尾零要补在正确一侧;有限精度结果用近似号;“再取一位”用于舍入,截断则直接舍弃后续位。二进制小数位数与十进制小数位数应严格区分。
实验 1:进制转换
保留 m 位二进制小数,相邻可表示数之间的间隔是 Δ=2⁻ᵐ。对正数直接截断相当于向下选格点,其误差满足 0≤x−x̂<2⁻ᵐ;对带负号的绝对值截断再还原负号,则向零逼近,绝对误差仍小于 2⁻ᵐ。若按最近值舍入,绝对误差不超过 2⁻⁽ᵐ⁺¹⁾。一般 b 进制的对应界分别是 b⁻ᵐ 与 b⁻ᵐ/2。
自测题:0.1₁₀ 截断到四位二进制小数是多少?误差是多少?
参考解析
0.1×16=1.6,向下取整数为 1,因此 x̂=1/16=(0.0001)₂=0.0625。误差为 0.0375,小于 1/16。若按最近值舍入,应取 2/16=(0.0010)₂=0.125,绝对误差 0.025。两种精度策略得到不同结果,所以回答前必须说明策略。
4. 二进制、八进制、十六进制与基本运算
对应课件第 31–39 页。
4.1 二、八、十六进制之间的分组转换
因为 8=2³,16=2⁴。三个二进制位恰好能表达八种状态,四个二进制位恰好能表达十六种状态。将二进制以小数点为界分组,相当于把三个或四个连续的二次幂位权合并成一个更大的位权。这个方法适用于基数有整幂关系的情况,二进制与十进制之间不具备这种整幂关系,因而不能直接使用相同的分组方法。
例题:(11100101.01)₂ 转八进制
从小数点向两侧,每三位一组:011 | 100 | 101 . 010。整数端左补 0,小数端右补 0。各组分别为 3、4、5 与 2,得到 (345.2)₈。复核:229.25₁₀。若整数侧错误地右补零,会改变所有原有位的位权,结果将不再与原数相等。
转十六进制时每四位一组:1110 | 0101 . 0100,得到 (E5.4)₁₆。反向转换则把每一位八进制写成三位二进制、每一位十六进制写成四位二进制,再根据需要去掉无意义的最左零和最右小数零。
八进制和十六进制之间可以经由二进制中转。例如 (5A.B)₁₆→0101 1010.1011₂→001 011 010.101 100₂→(132.54)₈。此处的空格只是分组提示,不是运算符。
4.2 二进制的基本算术运算
二进制加法“逢二进一”。0+0=0,0+1=1,1+0=1,1+1=10;若再有来自低位的进位,1+1+1=11。每一列都要同时处理本位结果和向高位的进位。减法“借一当二”:本位的 0 不够减 1 时,从高位借一个单位,它在本位等于两个单位。
例题:11001₂ 与 101₂ 的运算
先按个位对齐:11001 + 00101 = 11110,对应 25+5=30。减法为 11001 − 00101 = 10100,对应 20。乘法根据乘数从低到高的每一位决定是否加上移位后的被乘数:11001×101 = 11001 + 1100100 = 1111101,对应 25×5=125。除法 11001÷101=101,余数为 0,对应 25÷5=5。
对不截位的无符号数,左移一位相当于乘 2。若实际存储只有固定位数,左移会丢弃最高位;对含符号的数,移位还涉及符号扩展及舍入,所以“左移一定等于乘 2、右移一定等于除 2”要带条件。硬件能够复用加法器和移位电路完成多种算术运算,分析时须区分数学中的任意精度运算与固定位宽下的机器运算。
算术与逻辑要分开:作为数量时,1+1=10₂;作为逻辑“或”时,1+1=1。两者使用相同符号但规则不同,第二章将专门讨论逻辑运算。
自测题:计算 1011₂+0110₂,并说明四位存储下的保留结果。
参考解析
精确和为 10001₂,即 17。四位存储留下 0001,最高进位为 1。若两数按无符号解释,这是超出 0–15 的范围;若原位串按四位补码解释,1011 是 −5,0110 是 +6,和为 +1,未发生有符号溢出。相关原理见下一节。
5. 带符号整数的编码与表示范围
对应课件第 40–50 页。
“−5 的补码为 1011”这一表述以总位数为四位为前提。四位补码的 −5 是 1011,八位补码则是 11111011。编码规则和位宽共同决定意义。本节把 n 定义为包含最高位在内的总位数,讨论整数。最高位通常称为符号位,但在补码中,它还承担 −2ⁿ⁻¹ 的位权,其数值作用须与其余各位一并考虑。
5.1 原码表示
原码用最高位 0 表示非负、1 表示负,其余 n−1 位按普通二进制写绝对值。四位原码 +5 为 0101,−5 为 1101。这个规则直观,但 +0=0000 与 −0=1000 两种位串表示同一个数;正负数相加也不能直接把符号位当普通数位一起相加。
5.2 反码表示
正数反码等于原码。求负数反码,可以先把其绝对值写成 n 位正数,再逐位把 0、1 交换。例如 +5 的四位形式 0101 取反得到 −5 的反码 1010。等价地,从负数原码出发只取反数值位,保持符号位为 1。反码仍有 +0=0000 与 −0=1111。
在不溢出的前提下,反码可用普通二进制加法相加,但最高位产生的进位要回加到最低位,称为循环进位。例如用五位反码计算 14−5:14=01110,−5=11010,相加为 1 01000,再把左边进位 1 加到末位得 01001,即 9。回加步骤和双零使这种表示不如补码便于统一实现。
5.3 补码表示
对可表示的负整数 −a,先把正整数 a 写成 n 位,再全部位取反,最低位加 1,只保留 n 位。四位中 +5=0101→取反 1010→加一 1011,所以 −5 的补码为 1011。从负数原码 1101 出发的“符号位保持、数值位取反加一”也能得到同样结果,但后者不便处理最小负数,因此模运算定义能统一说明包括最小负数在内的全部情况。
| 真值 | 原码 | 反码 | 补码 |
|---|---|---|---|
| +26 | 00011010 | 00011010 | 00011010 |
| −26 | 10011010 | 11100101 | 11100110 |
| +0 | 00000000 | 00000000 | 00000000 |
| −0 | 10000000 | 11111111 | 与 +0 相同,无独立编码 |
| 解释方式 | 最小值 | 最大值 | 四位例子 |
|---|---|---|---|
| 无符号 | 0 | 2ⁿ−1 | 0 至 15 |
| 原码、反码 | −(2ⁿ⁻¹−1) | 2ⁿ⁻¹−1 | −7 至 +7,零有两种编码 |
| 补码 | −2ⁿ⁻¹ | 2ⁿ⁻¹−1 | −8 至 +7,零唯一 |
注意事项:反码与按位取反是相关但不同的词。说“某数的反码”需要真值和位宽;说“对位串取反”只是 0、1 互换的操作。补码中最高位为 1 时,低位不是绝对值。例如 1110 不是 −6,而是 −2。
自测题:六位的 −9,原码、反码和补码分别是什么?
参考解析
+9 写成六位为 001001。−9 的原码把最高位置 1,得 101001;反码对正数所有位取反,得 110110;补码在反码基础上加一,得 110111。解读补码时,用无符号值 55 减去 2⁶=64,得到 −9。
6. 补码的模运算解释与算术运算
对应课件第 43–57 页;补充模运算与定点解释,统一总位数约定。
6.1 模 2ⁿ:机器只保留最后 n 位
以钟表的 12 个刻度为例:从 10 点往回 5 格与往前 7 格都到 5 点,因为 −5 与 +7 相差一个整圈 12。n 位二进制存储可用模 M=2ⁿ 的循环系统描述;只保留低 n 位,就相当于对 M 取模。例如四位中 1111+0001 的精确结果是 10000,保留低四位得到 0000。
若 x≥0,U=x;若 x<0,U=2ⁿ+x。
解码:若 U<2ⁿ⁻¹,x=U;否则 x=U−2ⁿ。
取反加一可以由模运算直接推导。对 a 的 n 位二进制取反,得到 M−1−a;再加一得到 M−a,恰好与 −a 模 M 同余。因此,两个数的补码直接相加再取模,等价于真实整数和取模。若真实和仍在有符号表示范围内,按补码解读低 n 位就得到正确真值;若超出范围,位串仍会产生,但不能代表真实和。
6.2 负补码的解码与最小负数
解码一个负补码可以用“无符号值减 M”,也可以对位串全部取反加一求绝对值。例如八位 11100110 的无符号值为 230,230−256=−26。四位 1000 的无符号值为 8,8−16=−8。它不是额外随意塞进来的数,而是负位权解释和模系统的自然结果。
四位中 −8 的相反数 +8 超过最大值 +7。因此,对 1000 取反加一仍得到 1000,这表示“取负操作发生了溢出”,不能由此推断 −8=+8。最小负数无法在相同位宽的原码中表示;若一定要写它的原码,需要扩展位宽。
6.3 例题:四位补码计算 2−5 与 5−2
- 统一总位数为 4,允许范围是 −8 到 +7。
- 2−5=2+(−5)。2 编码为
0010,−5 编码为1011。 0010+1011=1101。无符号值为 13,按补码解码为 13−16=−3,结果正确。- 5−2=5+(−2)。
0101+1110=1 0011。舍去圈外的最高进位,留下0011=3,结果正确。
两次计算一个没有最高进位、一个有最高进位,却都没有有符号溢出。最高进位用于无符号意义的范围判断;补码是否溢出要另行判断。
6.4 二进制点:用整数编码表示定点小数
若约定 n 位中的低 f 位属于小数,就把整个 n 位补码先当整数解码,再乘 2⁻ᶠ。二进制点的位置由设计约定,并不需要在存储位中真的放一个“点”。此时最小间隔为 2⁻ᶠ,范围为 −2ⁿ⁻¹⁻ᶠ 到 2ⁿ⁻¹⁻ᶠ−2⁻ᶠ。比如总共 5 位、其中 2 位小数,范围为 −4 到 3.75。
例题:五位、两位小数表示 −2.75
先缩放成整数 −2.75×4=−11;五位补码存储值为 32−11=21,写成 10101。按约定标出二进制点,得到 101.01。负位权解读为 −4+1+1/4=−2.75。求其相反数时,取反 01010,加一得 01011,即 010.11=2.75。
此处“加一”指最后一位加 1,实际数值为 0.25;不能在小数点左边的个位加 1。不同小数位数的操作数应先对齐二进制点,再决定需要的整数位与符号位。
6.5 补码的符号扩展
把四位 −3=1101 扩成八位时,要复制最高位,得到 11111101,其无符号值 253 减 256 仍为 −3。若错误地左补 0 得到 00001101,结果将变为 +13。正补码扩展在左边补 0,负补码扩展在左边补 1,这一过程称为符号扩展。定点表示若增加小数精度,则在最右边补 0,保持二进制点的原有意义。
自测题:六位、两位小数的补码 111010 表示什么?扩到八位但小数仍为两位应怎么写?
参考解析
位串无符号值为 58,六位补码整数值为 58−64=−6,再除以 4 得 −1.5,写点形式为 1110.10。扩到八位时复制符号位为 11111010,写成 111110.10;按八位解码 (250−256)/4 仍为 −1.5。
7. 最高进位与有符号溢出
对应课件第 55–58 页。
有符号溢出是“真实数学结果超出当前有符号范围”。四位补码范围为 −8…+7,5+7=12 无法表示;硬件留下 1100,按补码解读是 −4,这个 −4 是环绕后的值。该位串仍是模运算的结果,但无法表示真实数学结果。增加到五位后,00101+00111=01100,便可正确表示 12。
| 真值运算 | 位串加法 | 最高进位 | 留下的补码值 | 有符号溢出 |
|---|---|---|---|---|
| 5+7=12 | 0101+0111=0 1100 | 0 | −4 | 是 |
| −3+2=−1 | 1101+0010=0 1111 | 0 | −1 | 否 |
| −3+(−1)=−4 | 1101+1111=1 1100 | 1 | −4 | 否 |
| −7+(−2)=−9 | 1001+1110=1 0111 | 1 | +7 | 是 |
7.1 有符号溢出的判定方法
- 范围判据:用足够精度计算真实结果,检查是否落在 [−2ⁿ⁻¹,2ⁿ⁻¹−1]。这是最直接的定义,也最适合手算复核。
- 符号判据:加法中,同号操作数相加而结果异号,才溢出;异号相加不会溢出。减法 A−B 中,A、B 异号且结果符号不同于 A 时溢出。同号减法不会溢出。
- 进位判据:补码加法的符号位进位输入 Cin 与进位输出 Cout 不相等时溢出,即 V=Cin⊕Cout。减法用 A+按位取反(B)+1 的加法电路判断。
例如四位 5+7 中,低三位 101+111=1100,向符号位输入的进位为 1;符号位计算 0+0+1=1,没有向更高位输出进位,所以 V=1⊕0=1。−3+2 中,低三位 101+010=111,进位输入为 0;最高位 1+0=1,进位输出也为 0,所以 V=0。
对课件第 57 页的补充限定:不能普遍用“最终最高进位与结果符号位不同”判断溢出。反例 −3+2=0 1111 中,最高进位为 0、结果符号为 1,但结果 −1 完全正确。应比较进入符号位的进位与离开符号位的进位,或使用前面的符号、范围判据。
7.2 例题:四位补码计算 −6−3
−6 编码为 1010,+3 编码为 0011。减法写为 1010+1100+0001=1 0111,留下 0111=+7。真实结果为 −9,低于 −8,故溢出。符号判据也能看出:负数减正数,本应更小,但结果变成正数。因此,最高进位为 1 并不能单独决定是否发生有符号溢出。
实验 2:补码加减法与溢出
例如四位 5+7 中,低三位 101+111=1100,向符号位输入的进位为 1;符号位计算 0+0+1=1,没有向更高位输出进位,所以 V=1⊕0=1。−3+2 中,低三位 101+010=111,进位输入为 0;最高位 1+0=1,进位输出也为 0,所以 V=0。
自测题:八位补码 01111111+00000001,有最高进位吗?是否溢出?
参考解析
得到 0 10000000,最高进位为 0;真实结果 127+1=128 超出最大值 127,故有符号溢出。符号位进位输入是 1,输出是 0;结果位串按八位补码只能解释成 −128。若把输入作为无符号数,同样的位串运算表示 127+1=128,则无符号结果仍可表示。
8. 反射格雷码
对应课件第 59–67 页。
编码是把信息与位串建立约定的对应关系。自然二进制码按二进制位权表示整数,它计算方便,但相邻整数的位串可能有多位变化:7=0111 到 8=1000,四位都改变。实际电路不可能让所有位绝对同步变化,在过渡瞬间可能读到中间状态。
本课使用二进制反射格雷码。其按序相邻的两个码字仅有一位不同;首尾也只差一位。两个位串不同位置的数目称为汉明距离,因此相邻格雷码的汉明距离为 1。注意“相邻”指码表中的顺序相邻,并非任意两个格雷码都相差一位;格雷码也不能直接用 8、4、2、1 加权来读数。
8.1 反射构造法
一位格雷序列为 0、1。构造两位序列时,将原序列顺序排列并在每项前加 0,得到 00、01;将原序列逆序排列并在每项前加 1,得到 11、10;两部分合并为 00、01、11、10。对三位重复操作:前半为 000、001、011、010,后半为 110、111、101、100。中间连接处只有新增的最高位变化,首尾也具有这一性质。
8.2 自然二进制与格雷码转换
格雷 → 二进制:bn−1=gn−1;bi=bi+1⊕gi。
异或 ⊕ 的规则是相同为 0、不同为 1。前向转换取原二进制的相邻两位异或;反向转换必须使用已经恢复出的上一位二进制,从最高位逐位向右进行。两组公式形式相近,但所用二进制位的来源不同。
例题:1011₂ 与格雷码互转
二进制 1 0 1 1 的最高位为 1,转换时保持不变;后面依次算 1⊕0=1、0⊕1=1、1⊕1=0,得到格雷码 1110。反向时先得 b₃=1,然后 b₂=1⊕1=0、b₁=0⊕1=1、b₀=1⊕0=1,恢复 1011。
实验 3:格雷码转换
异或 ⊕ 的规则是相同为 0、不同为 1。前向转换取原二进制的相邻两位异或;反向转换必须使用已经恢复出的上一位二进制,从最高位逐位向右进行。两组公式形式相近,但所用二进制位的来源不同。
注意事项:“相邻只变一位”有助于减少多位不同步导致的过渡歧义,但不等于自动消除一切物理问题。格雷码不是纠错码,也不是把任意两组输入转成只差一位。不能对格雷码位串直接做自然二进制加一,来获得下一个格雷码。
自测题:自然二进制 0101 对应什么格雷码?与下一个状态的格雷码差几位?
参考解析
0101→0111;下一个自然二进制状态 0110→0101。两个格雷码 0111 与 0101 仅倒数第二位不同,汉明距离为 1。0101 这个位串本身既可能是自然二进制,也可能是格雷码,含义必须由上下文决定。
9. BCD:逐位编码十进制数字
对应课件第 68–80 页。
BCD 是“二进制编码的十进制”,它不是把整个十进制整数转成自然二进制,而是对每个十进制数字分别分配一个四位码组。用 4 位表示 0–9 是因为三位只有 8 种状态,不够表示十种数字;四位有 16 种状态,因此选用 10 个、留下 6 个不用。不同 BCD 规则会选用不同码组。
9.1 8421 BCD:每个码组内部按位权读一位数字
8421 BCD 的四位权为 8、4、2、1,0–9 依次使用 0000 到 1001。1010 到 1111 是非法码组,不能把它们当成合法的一位十进制数字。比如十进制 59 的 8421 BCD 为 0101 1001;整个数的自然二进制却是 111011。BCD 的位数较多,但方便按十进制数字处理、显示。
例题:编码与解码
(205.7)₁₀ 的 8421 BCD 为 0010 0000 0101 . 0111,每个十进制数字保留四位,小数点位置另行约定。解码 1001 0011 时,分别得到 9 和 3,因此数值为 93;若把整个八位串当自然二进制计算,会得到 147,该值不符合 BCD 的解释规则。若某组是 1101,应先报告非法 BCD,不能将其解释为某一十进制数位。
9.2 BCD 加法及加 6 修正
一个四位二进制码组的自然进位模数为 16,而十进制数字的进位模数为 10,两者差 6。设某一十进制位的两个数字及来自低位的十进制进位之和为 s,则 0≤s≤19。若 s≤9,原始二进制和已经是合法 BCD,不修正。若 s≥10,需要个位显示 s−10、向高位进 1;对原始和加 6,正好把“减 10”转成“模 16 后留下 s−10”。
逐位处理时:s≥10 就向上一十进制位进 1,本位保留 s−10。
例题:5+8 与 8+9
5+8:0101+1000=1101,原始结果为 13,大于 9;加 0110 得 1 0011,表示十位 1、个位 3,结果 BCD 为 0001 0011。
8+9:1000+1001=1 0001。虽然留下的低四位 0001 小于 10,原始加法已有最高进位,仍要修正低四位:0001+0110=0111,结合十进制进位得 0001 0111,表示 17。只检查低四位是否大于 9 会漏掉这种情况。
例题:712+989,逐位传递十进制进位
- 个位:2+9=11,
0010+1001=1011;加 6 后得到1 0001,本位 1、向十位进 1。 - 十位:1+8+1=10,原始
1010,加 6 得1 0000,本位 0、向百位进 1。 - 百位:7+9+1=17,原始
1 0001;修正低四位为0111,本位 7、向千位进 1。 - 结果为 1701,BCD 为
0001 0111 0000 0001。
按十进制数位逐位处理,可以明确各位的修正条件与进位传递关系。修正过程中产生的进位即为该位的十进制进位,不构成对同一码组无条件再次加 6 的依据。
9.3 BCD 减法:借位后减 6
如果直接以四位二进制码组做减法,借一个高位相当于借来 16,而十进制借位应当只借来 10,因而借位后本位多了 6,需减去 0110 修正。逐位十进制借位过程可作为各码组二进制修正结果的复核依据。
例题:255−098
个位 5−8 不够减,四位模减得到 13=1101,借位后减 6 得 7=0111。十位接到借位:5−9−1=−5,四位模减得到 11=1011,再减 6 得 5=0101,并向百位借 1。百位 2−0−1=1,无需修正。结果 BCD 为 0001 0101 0111,即 157。此例结果非负;若处理负结果,还须另外约定符号或十进制补码规则,不能套用二进制补码的解释。
注意事项:加 6 是码组越过十进制边界时的修正,不是每次 BCD 相加都加 6;低四位合法也可能因原始进位需要修正;十进制进位必须传给相邻的十进制码组。BCD 的“最高位”不自动是符号位。
自测题:用 8421 BCD 计算 9+9,并说明低四位为 0010 时仍需修正的原因。
参考解析
1001+1001=1 0010,原始四位加法已有进位,所以对低四位加 0110 得 1000。连同十进制进位,结果为 0001 1000,即 18。直接把 1 0010 当 BCD 会错读为 12。
10. Aiken 2421 码与余 3 码
对应课件第 69–73、81–84 页。
10.1 Aiken 2421 码的定义与性质
2421 码四位的权依次为 2、4、2、1。由于有两个权为 2 的位置,仅给定权还不能保证唯一编码;比如 2 可由 0010 或 1000 加权得到。本课采用课件中的 Aiken 2421 码,明确选择下表的十个码组。0–4 使用 0000 至 0100,5–9 使用 1011 至 1111;中间的 0101 至 1010 不使用。
| 数字 d | 8421 BCD | Aiken 2421 | 余 3 码(d+3 的四位二进制) |
|---|---|---|---|
| 0 | 0000 | 0000 | 0011 |
| 1 | 0001 | 0001 | 0100 |
| 2 | 0010 | 0010 | 0101 |
| 3 | 0011 | 0011 | 0110 |
| 4 | 0100 | 0100 | 0111 |
| 5 | 0101 | 1011 | 1000 |
| 6 | 0110 | 1100 | 1001 |
| 7 | 0111 | 1101 | 1010 |
| 8 | 1000 | 1110 | 1011 |
| 9 | 1001 | 1111 | 1100 |
例如十进制数字 7 的码组为 1101,按 2、4、2、1 加权为 2+4+0+1=7。把这个码组逐位取反得到 0010,恰好是数字 2=9−7 的码。0 与 9、1 与 8、2 与 7、3 与 6、4 与 5 的编码互为按位反,因此称为自补码。此处的“补”表示逐十进制数字的 9 补关系,应与固定字长二进制整数的补码概念区分。
有权性与自补性不意味着普通二进制加法的结果均无需修正。课件第 81 页的相关表述不能作为通用运算规则。例如 2+3:0010+0011=0101,原始和属于非法 Aiken 码;正确的 5 应编码成 1011。再如 4+6=10,0100+1100=1 0000 恰好得到正确编码,但该情况不构成一般加法规则。本章学习重点是码表、位权、自补性质;做 2421 算术需另行设计对应的十进制修正逻辑。
10.2 余 3 码的定义与自补性
十进制数字 d 的余 3 码,是 d+3 的四位自然二进制表示。例如 0→0011,5→1000,9→1100。因此解码时先把四位当无符号数读出,再减 3。合法码组从 0011 到 1100。余 3 码不是普通的 8421 有权 BCD:虽然码组由自然二进制规则生成,但它所代表的十进制数字比其无符号值少 3。
它同样自补:对 d+3 的四位取反得 15−(d+3)=12−d,而数字 9−d 的余 3 码无符号值为 (9−d)+3=12−d,二者相同。因此 2 的余 3 码 0101 取反是 1010,对应数字 7。
10.3 余 3 码加法修正:无进位减 3,有进位加 3
设单个十进制位相加,包括低位进位后的真值和为 s。两个输入码组已各自多加 3,原始二进制和便是 s+6。若 s<10,原始和小于 16,没有四位进位;目标余 3 码应为 s+3,所以原始和减 3。若 s≥10,原始和至少 16,产生进位;低四位为 s+6−16=s−10,目标个位余 3 码应为 s−10+3,因此低四位加 3。进位作为普通的十进制进位值 1 加入高位运算,不是把 0001 直接当成一个余 3 码数字。
例题:2+3 与 8+3
2+3:输入码为 0101 与 0110,原始和 1011 无进位;减 0011 得 1000,这是数字 5 的余 3 码。
8+3:输入 1011+0110=1 0001,有进位;低四位 0001 加 3 得 0100,表示个位 1。若写成两位十进制的余 3 编码,还要把十位数字 1 编成 0100,完整结果是 0100 0100,表示 11,不能写成 0001 0100。
自测题:十进制 48 的 2421 码、余 3 码各是什么?把余 3 码的所有位取反会得到哪个两位十进制数?
参考解析
逐位查表:48 的 Aiken 2421 为 0100 1110;余 3 为 0111 1011。后者逐位取反为 1000 0100,分别解码为 5、1,得到 51=99−48。这体现了逐十进制数字的 9 补关系。
11. ASCII 字符编码
对应课件第 85–86 页。
计算机还需要表示字母、数字字符、标点、空格和控制符。ASCII 给 128 个字符分配了 7 位代码。一个字符的编码值只是约定的编号,与该字符所表示的数值概念不同。字符 '5' 的 ASCII 值为 53,七位为 0110101;数值 5 的自然二进制是 101,8421 BCD 为 0101。三者都能在数字系统中出现,但服务于不同目标。
| 字符 | 十进制编号 | 十六进制编号 | 七位 ASCII |
|---|---|---|---|
| 空格 | 32 | 20 | 0100000 |
| '0' | 48 | 30 | 0110000 |
| '5' | 53 | 35 | 0110101 |
| '9' | 57 | 39 | 0111001 |
| 'A' | 65 | 41 | 1000001 |
| 'K' | 75 | 4B | 1001011 |
| 'a' | 97 | 61 | 1100001 |
例题:文本 “59” 的 ASCII 编码
文本 “59” 包含两个字符,分别编码。'5' 的编号 53 写成七位 0110101,'9' 的编号 57 写成 0111001。若在八位字节中以高位补零存储,则为 00110101 00111001。这既不是数值 59 的自然二进制 111011,也不是 59 的 BCD 0101 1001。
ASCII 数字字符的编号连续,从 '0' 的 48 到 '9' 的 57。已知输入确实是一个十进制数字字符时,用编号减去 48 可得到数值 0–9;必须先验证字符范围,不能对任意字母也这样解释。
课件提到在七位 ASCII 左边加一位奇偶校验位,这是一种传输方案;八位存储也可以仅在高位补零,具体含义由协议决定。不能仅凭八位存储宽度认定最高位必然用作校验。ASCII 的字符范围不包含汉字,更广泛的字符表示需要其他字符集与编码规则。
自测题:1001011 是哪个 ASCII 字符?若采用八位偶校验,校验位放左边,应添加 0 还是 1?
参考解析
1001011 的值为 64+8+2+1=75,对应 K。七位中有 4 个 1,本来已经是偶数,因此偶校验位取 0,发送 01001011。若使用奇校验,左边则加 1,得到 11001011。
12. 奇偶校验编码
对应课件第 87–90 页。
传输过程中,某个位可能从 0 翻成 1,或从 1 翻成 0。若所有位串都能表示有效信息,接收端可能无法知道传输是否出错。校验编码通过引入冗余,使接收端能够检查所接收的位串是否满足约定约束。单个奇偶校验位不增加原始信息内容,而是增加一个用于检错的约束条件。
12.1 编码与检查规则
偶校验要求信息位加校验位中,1 的总数为偶数;奇校验要求总数为奇数。约定信息位为 d₀…dₖ₋₁,校验位为 p,用异或表示:
奇校验:p=1⊕d₀⊕d₁⊕…⊕dₖ₋₁,使所有发送位异或为 1。
例题:信息位 1011001
信息中有 4 个 1。若校验位放最左侧,偶校验应取 p=0,发送 01011001,共有 4 个 1;奇校验应取 p=1,发送 11011001,共有 5 个 1。接收端不知道原始信息,也可以重新统计收到位串中 1 的奇偶性。
偶校验发送 01011001 后,如果最右位从 1 翻为 0,收到 01011000,1 的总数变为 3,检查失败。若最右两位都翻转,收到 01011010,总数又为 4,检查通过,但数据已经出错。
12.2 检错范围与纠错能力的限制
每翻转一个位,总体奇偶性就改变一次,因此任意奇数个不同位置的位发生翻转都会被发现,包括校验位本身发生错误;任意偶数个不同位置翻转则不改变总体奇偶性,这种校验无法发现。课件用“能发现单错、不能发现双错”说明最常见情况,完整规律是奇数位与偶数位翻转,而不是仅能发现一位错误。
校验失败表明位串不满足约定,但不能定位出错位置。若收到一个不满足偶校验的八位串,翻转其中任意一位都能恢复偶数个 1,候选答案有多个,所以单个奇偶校验位通常没有定位与纠错能力。另一方面,校验通过仅表明约束满足,不能证明数据正确,因为偶数位错误可能漏检。
实验 4:奇偶校验与位翻转
校验失败表明位串不满足约定,但不能定位出错位置。若收到一个不满足偶校验的八位串,翻转其中任意一位都能恢复偶数个 1,候选答案有多个,所以单个奇偶校验位通常没有定位与纠错能力。另一方面,校验通过仅表明约束满足,不能证明数据正确,因为偶数位错误可能漏检。
注意事项:奇偶性要统计信息位和校验位的总和;校验位的位置必须事先约定;“检验通过”不等于“数据必然正确”;如果同一位置连续翻转两次,它最终恢复原值,应按最终被改变的位置数分析。
自测题:判断偶校验能否检出包含校验位的三位错误,以及仅校验位出错的情况。
参考解析
两种情况均可检出。校验位与信息位均参与总体异或,遵循相同的检错规律。任意三位翻转改变总体奇偶性,单独一个校验位翻转同样改变总体奇偶性。检测失败仍然不能确定是哪几个位置出错。
13. 方法归纳与综合练习
位串的分析应以表示约定为基础,包括编码对象、编码规则、总位数、符号约定、二进制点位置及精度处理方式。只有这些条件明确,数值解读、算术运算与结果验证才具有确定意义。
| 任务 | 计算方法 | 完成后的复核 |
|---|---|---|
| 任意进制读成十进制 | 按位权展开 | 数码是否合法、数量级是否合理 |
| 十进制转二进制 | 整数除 2 取余;小数乘 2 取整 | 整数倒序、小数顺序;近似误差 |
| 二、八、十六进制互转 | 以小数点为界按三位或四位分组 | 补零方向、小数点位置 |
| 有符号加减法 | 统一位宽与小数位,再补码运算 | 计算真实数学结果,检查范围与溢出 |
| 格雷码转换 | 最高位保持不变,按正确的相邻或恢复位异或 | 往返恢复;相邻状态汉明距离 |
| BCD 运算 | 每个十进制位独立处理并传递进位 | 所有码组是否合法、修正条件是否满足 |
| 奇偶校验 | 所有发送位异或 | 区分检测失败、通过但仍有错 |
综合练习
练习 1:把 45.375₁₀ 转成二进制、八进制、十六进制,并说明是不是精确结果。
参考解析
45=32+8+4+1→101101;0.375=3/8=1/4+1/8→.011。合并得 101101.011₂。按三位分组 101 101.011→55.3₈;按四位分组 0010 1101.0110→2D.6₁₆。都是精确结果,因为小数分母约分后只含 2。
练习 2:位串 10010110 按无符号数、八位补码、8421 BCD 各表示什么?
参考解析
无符号值为 128+16+4+2=150;八位补码为 150−256=−106;按 8421 BCD 分为 1001 0110,分别为 9、6,因此是 96。三种答案都来自同一位串,差别来自解释规则。
练习 3:六位补码计算 19+17 和 −20−15,分别列出保留位串与溢出判断。
参考解析
六位范围 −32…31。19=010011,17=010001,和 100100,按补码读为 36−64=−28;真实和 36 超界,有溢出。−20=101100,−15=110001,相加 1 011101,低六位 011101=29;真实和 −35 超界,也溢出。第二题 −20−15 等价于 −20+(−15)。增加到七位后两题都可以正确表示。
练习 4:自然二进制 1111 的格雷码是多少?格雷码 1000 又对应什么自然二进制?
参考解析
1111 的相邻位均相同,最高位为 1,因此格雷码为 1000。逆变换从 1 开始,后续与 0 异或都保持上一位为 1,恢复 1111。对四位反射格雷序列,最后一项 1000 与第一项 0000 仅差最高位。
练习 5:用 8421 BCD 表示 68+57 的运算结果,再写出结果的余 3 编码。
参考解析
个位 8+7=15,修正后为 5 并进 1;十位 6+5+1=12,修正后为 2 并进 1;得到 125。8421 BCD 为 0001 0010 0101。对每个数字加 3 后编码,余 3 为 0100 0101 1000。若只把整个 125 加 3 再转二进制,则不符合逐位余 3 编码的定义。
练习 6:发送偶校验码 01011001,收到 11011000。校验会通过吗?能否证明收到的数据正确?
参考解析
收到串中有 4 个 1,偶校验通过。但与原串相比,最左和最右两位都翻转,属于偶数位错误,会漏检。校验位发生错误也计入翻转数。通过仅说明奇偶约束满足。
参考来源与学习要求
参考课件《CHAPTER1 数制与编码》:数制与转换第 2–35 页;算术与机器码第 36–58 页;信息编码与格雷码第 59–67 页;BCD、2421 与余 3 第 68–84 页;ASCII 第 85–86 页;可靠性编码第 87–90 页。第 46 页最小负数的解释、第 57 页溢出判据、第 81 页 2421 加法与第 90 页检错范围的适用条件,已在相应小节说明。
本章笔记。本章学习要求包括:解释同一位串在不同规则下的意义;完成补码加减并判断溢出;区分自然二进制、逐位 BCD 编码与字符编码。