第 01 章

数制与编码

位串 1001 按不同规则解释,可分别表示无符号整数 9、四位补码整数 −7,或十进制数字 9 的 BCD 编码。因此,分析数值表示与运算时,必须明确编码规则、总位数及二进制点位置。

主要参考《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。因此,基数决定进位规则,位置决定位权,数码决定该位取几个单位。

(ak…a1a0.a−1…a−m)b = Σ aibi,其中 0 ≤ ai < b。
二进制10110.101按位展开,位权分别为16、8、4、2、1和二分之一、四分之一、八分之一,得到22.625
按位权展开:数值等于各数位的数码与位权之积的总和。
四种常用进制
进制基数合法数码常用下标一位的最大值
二进制20、12 或 B1
八进制80–78 或 O7
十进制100–910 或 D9
十六进制160–9、A–F;A=10,…,F=1516 或 H15

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 的商余数余数属于哪一位
371812⁰
18902¹
9412²
4202³
2102⁴
1012⁵

商为 0 时结束,余数从下向上读取为 100101。复核:32+4+1=37。若题目要求 8 位无符号数,左边补零得到 00100101;补零是为了符合位宽,并不改变数值。

3.3 十进制小数到 b 进制:乘 b 取整,顺序读取

对 0≤f<1,乘 b 后得到 bf=a₋₁+f₁。整数部分 a₋₁ 是小数第一位,因为它原本乘的是 b⁻¹;把这一位去掉,再乘 b,得到第二位。每次乘基数均使下一小数位移至整数部分,因此各小数位按由高到低的顺序产生,按产生顺序书写。

例题:把 0.6875 转为二进制

  1. 0.6875×2=1.375,取整数 1,保留小数 0.375。
  2. 0.375×2=0.75,取整数 0,保留小数 0.75。
  3. 0.75×2=1.5,取整数 1,保留小数 0.5。
  4. 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 出发的“符号位保持、数值位取反加一”也能得到同样结果,但后者不便处理最小负数,因此模运算定义能统一说明包括最小负数在内的全部情况。

固定为八位整数,对比三种编码
真值原码反码补码
+26000110100001101000011010
−26100110101110010111100110
+0000000000000000000000000
−01000000011111111与 +0 相同,无独立编码
n 位整数的范围
解释方式最小值最大值四位例子
无符号02ⁿ−10 至 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。

n 位补码的存储值 U ≡ x (mod 2ⁿ)。
若 x≥0,U=x;若 x<0,U=2ⁿ+x。
解码:若 U<2ⁿ⁻¹,x=U;否则 x=U−2ⁿ。
四位补码模16环,位串0000到0111对应0到7,1000到1111对应负8到负1,15加1回到0
同一位串既有无符号值 U,也可以按补码解释为有符号值 x。

取反加一可以由模运算直接推导。对 a 的 n 位二进制取反,得到 M−1−a;再加一得到 M−a,恰好与 −a 模 M 同余。因此,两个数的补码直接相加再取模,等价于真实整数和取模。若真实和仍在有符号表示范围内,按补码解读低 n 位就得到正确真值;若超出范围,位串仍会产生,但不能代表真实和。

6.2 负补码的解码与最小负数

解码一个负补码可以用“无符号值减 M”,也可以对位串全部取反加一求绝对值。例如八位 11100110 的无符号值为 230,230−256=−26。四位 1000 的无符号值为 8,8−16=−8。它不是额外随意塞进来的数,而是负位权解释和模系统的自然结果。

x = −bn−1·2ⁿ⁻¹ + Σi=0…n−2bi·2ⁱ。

四位中 −8 的相反数 +8 超过最大值 +7。因此,对 1000 取反加一仍得到 1000,这表示“取负操作发生了溢出”,不能由此推断 −8=+8。最小负数无法在相同位宽的原码中表示;若一定要写它的原码,需要扩展位宽。

6.3 例题:四位补码计算 2−5 与 5−2

  1. 统一总位数为 4,允许范围是 −8 到 +7。
  2. 2−5=2+(−5)。2 编码为 0010,−5 编码为 1011。
  3. 0010+1011=1101。无符号值为 13,按补码解码为 13−16=−3,结果正确。
  4. 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=120101+0111=0 11000−4是
−3+2=−11101+0010=0 11110−1否
−3+(−1)=−41101+1111=1 11001−4否
−7+(−2)=−91001+1110=1 01111+7是

7.1 有符号溢出的判定方法

  1. 范围判据:用足够精度计算真实结果,检查是否落在 [−2ⁿ⁻¹,2ⁿ⁻¹−1]。这是最直接的定义,也最适合手算复核。
  2. 符号判据:加法中,同号操作数相加而结果异号,才溢出;异号相加不会溢出。减法 A−B 中,A、B 异号且结果符号不同于 A 时溢出。同号减法不会溢出。
  3. 进位判据:补码加法的符号位进位输入 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 加权来读数。

三位自然二进制序列与反射格雷码序列比较,格雷码000、001、011、010、110、111、101、100相邻只改变一位,包含首尾
第二章卡诺图采用 00、01、11、10 的顺序,正是为了把逻辑相邻关系放到几何相邻位置。

8.1 反射构造法

一位格雷序列为 0、1。构造两位序列时,将原序列顺序排列并在每项前加 0,得到 00、01;将原序列逆序排列并在每项前加 1,得到 11、10;两部分合并为 00、01、11、10。对三位重复操作:前半为 000、001、011、010,后半为 110、111、101、100。中间连接处只有新增的最高位变化,首尾也具有这一性质。

8.2 自然二进制与格雷码转换

二进制 → 格雷:gn−1=bn−1;gi=bi+1⊕bi。
格雷 → 二进制: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 规则会选用不同码组。

十进制数59按自然二进制编码为111011,按8421BCD逐位编码为0101 1001,字符文本59按ASCII分别编码为00110101和00111001
数值编码与字符编码的对象不同;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”。

某位原始四位和 >1001₂,或该位原始加法产生四位以外的进位 → 加 0110₂ 修正。
逐位处理时: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,逐位传递十进制进位

  1. 个位:2+9=11,0010+1001=1011;加 6 后得到 1 0001,本位 1、向十位进 1。
  2. 十位:1+8+1=10,原始 1010,加 6 得 1 0000,本位 0、向百位进 1。
  3. 百位:7+9+1=17,原始 1 0001;修正低四位为 0111,本位 7、向千位进 1。
  4. 结果为 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 不使用。

每一行对应一位十进制数字
数字 d8421 BCDAiken 2421余 3 码(d+3 的四位二进制)
0000000000011
1000100010100
2001000100101
3001100110110
4010001000111
5010110111000
6011011001001
7011111011010
8100011101011
9100111111100

例如十进制数字 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 例子
字符十进制编号十六进制编号七位 ASCII
空格32200100000
'0'48300110000
'5'53350110101
'9'57390111001
'A'65411000001
'K'754B1001011
'a'97611100001

例题:文本 “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=d₀⊕d₁⊕…⊕dₖ₋₁,使所有发送位异或为 0。
奇校验: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 编码与字符编码。

第二章:组合逻辑函数 →