第 1 讲:数制、补码与常用编码
数字系统首先要解决“信息怎样变成位串”。同一串 0/1 按无符号数、补码、BCD 或字符解释,会代表完全不同的对象。
位权与进制转换
进制数
转十进制直接按位权展开。十进制整数转 进制用除 取余、余数逆序;小数部分用乘 取整、整数顺序写下。
二、八、十六进制可通过分组互转:从小数点向两侧每 3 位二进制对应一位八进制,每 4 位对应一位十六进制,不足补零。
有限十进制小数在二进制中可能无限循环。按给定位数截断或舍入时,应区分表示误差,不要假装精确相等。
无符号与有符号范围
位无符号数范围:
原码用最高位表示符号,存在 ;反码对负数的数值位逐位取反,也有两个零;补码把负数表示为对应正数按位取反再加 1,只有一个零,适合统一加减法。
位补码范围:
最小负数 没有同位宽正数对应,求绝对值时要注意溢出。
补码加减与符号扩展
补码加法使用普通二进制加法,最高位之外的进位丢弃。减法转化为
扩大位宽时,无符号数在左边补 0;补码数做符号扩展,复制最高符号位。例如 8 位补码 11110110 扩成 16 位应为 11111111 11110110。
进位和溢出不是一回事
- 无符号加法关注最高位进位;
- 有符号补码加法关注结果是否超出表示范围。
两个正数相加得到负号,或两个负数相加得到正号,发生有符号溢出。硬件上也可判断符号位的输入进位 与输出进位 是否不同:
十进制编码
8421 BCD 用 4 位表示一个十进制数字,只使用 0000 到 1001,1010 到 1111 为非法码。BCD 加法若某一位结果大于 9 或产生十六进制进位,需要加 0110 校正。
BCD 是“每个十进制位单独编码”,不是把整个十进制数直接转二进制。例如十进制 25 的 BCD 是 0010 0101,纯二进制是 11001。
Gray 码
相邻 Gray 码只改变一位,可减少机械位置编码或异步采样时多位同时翻转造成的错误。
二进制 转 Gray:最高位不变,之后
Gray 转二进制:最高位不变,之后逐位累积异或
Karnaugh 图的行列也按 Gray 顺序排列,正是为了让相邻格只有一个变量变化。
字符编码
ASCII 用 7 位定义基本字符,实际常放在 8 位字节中。数字字符 '0' 的编码与数值 0 不同;字符 '0' 到 '9' 的码值连续,做转换时可加减 '0'。
汉字编码包含输入码、交换码、机内码、字形码等不同层次;同一个汉字的“怎样输入、怎样存储、怎样显示”不是同一种编码任务。
检查方法
- 写清位宽和解释方式;
- 转补码时先确认数值在范围内;
- 小位宽举例验算溢出;
- BCD 每 4 位不得超过 9;
- Gray 码相邻项应只有一位不同;
- 字符码不要和数字的二进制表示混淆。