第 1 讲:数制、补码与常用编码

数字系统首先要解决“信息怎样变成位串”。同一串 0/1 按无符号数、补码、BCD 或字符解释,会代表完全不同的对象。

位权与进制转换

rr 进制数

(an−1⋯a0.a−1⋯a−m)r=∑i=−mn−1airi.(a_{n-1}\cdots a_0.a_{-1}\cdots a_{-m})_r =\sum_{i=-m}^{n-1}a_ir^i.

转十进制直接按位权展开。十进制整数转 rr 进制用除 rr 取余、余数逆序;小数部分用乘 rr 取整、整数顺序写下。

二、八、十六进制可通过分组互转:从小数点向两侧每 3 位二进制对应一位八进制,每 4 位对应一位十六进制,不足补零。

有限十进制小数在二进制中可能无限循环。按给定位数截断或舍入时,应区分表示误差,不要假装精确相等。

无符号与有符号范围

nn 位无符号数范围:

0≤N≤2n−1.0\le N\le2^n-1.

原码用最高位表示符号,存在 +0,−0+0,-0;反码对负数的数值位逐位取反,也有两个零;补码把负数表示为对应正数按位取反再加 1,只有一个零,适合统一加减法。

nn 位补码范围:

−2n−1≤N≤2n−1−1.-2^{n-1}\le N\le2^{n-1}-1.

最小负数 100⋯0100\cdots0 没有同位宽正数对应,求绝对值时要注意溢出。

补码加减与符号扩展

补码加法使用普通二进制加法,最高位之外的进位丢弃。减法转化为

A−B=A+[−B]补.A-B=A+[-B]_{补}.

扩大位宽时,无符号数在左边补 0;补码数做符号扩展,复制最高符号位。例如 8 位补码 11110110 扩成 16 位应为 11111111 11110110。

进位和溢出不是一回事

  • 无符号加法关注最高位进位;
  • 有符号补码加法关注结果是否超出表示范围。

两个正数相加得到负号,或两个负数相加得到正号,发生有符号溢出。硬件上也可判断符号位的输入进位 Cn−1C_{n-1} 与输出进位 CnC_n 是否不同:

V=Cn−1⊕Cn.V=C_{n-1}\oplus C_n.

十进制编码

8421 BCD 用 4 位表示一个十进制数字,只使用 0000 到 1001,1010 到 1111 为非法码。BCD 加法若某一位结果大于 9 或产生十六进制进位,需要加 0110 校正。

BCD 是“每个十进制位单独编码”,不是把整个十进制数直接转二进制。例如十进制 25 的 BCD 是 0010 0101,纯二进制是 11001。

Gray 码

相邻 Gray 码只改变一位,可减少机械位置编码或异步采样时多位同时翻转造成的错误。

二进制 BB 转 Gray:最高位不变,之后

Gi=Bi+1⊕Bi.G_i=B_{i+1}\oplus B_i.

Gray 转二进制:最高位不变,之后逐位累积异或

Bi=Bi+1⊕Gi.B_i=B_{i+1}\oplus G_i.

Karnaugh 图的行列也按 Gray 顺序排列,正是为了让相邻格只有一个变量变化。

字符编码

ASCII 用 7 位定义基本字符,实际常放在 8 位字节中。数字字符 '0' 的编码与数值 0 不同;字符 '0' 到 '9' 的码值连续,做转换时可加减 '0'。

汉字编码包含输入码、交换码、机内码、字形码等不同层次;同一个汉字的“怎样输入、怎样存储、怎样显示”不是同一种编码任务。

检查方法

  • 写清位宽和解释方式;
  • 转补码时先确认数值在范围内;
  • 小位宽举例验算溢出;
  • BCD 每 4 位不得超过 9;
  • Gray 码相邻项应只有一位不同;
  • 字符码不要和数字的二进制表示混淆。

评论