《计算机组成与体系结构(原书第4版)》 —2.6 字符编码
2.6 字符编码
我们已经看到数字计算机如何使用二进制系统来表示和操作数值。我们还没有考虑这些内部值如何转换为对人类有意义的表示。这种方式取决于计算机使用的编码系统和值如何被存储和检索。
2.6.1 二进制编码的十进制
对于许多应用程序,我们需要十进制系统的精确等效二进制数,这意味着我们需要对十进制数字的每位进行编码。在许多商业应用程序中处理钱数正是这种情况——在金融交易中,当我们将实数转换为浮点数时,我们不能承担舍入误差!
二进制编码的十进制(BCD)在电子学中非常普遍,特别是闹钟和计算器等显示数值数据的地方。BCD将十进制数的每位数字编码为4位二进制形式。每个小数数字被单独转换为等价的二进制数,如表2-5所示。例如,要编码146,则十进制数字将分别替换为0001、0100和0110。
因为大多数计算机使用字节作为最小的访问单位,因此大多数值存储在8位中,而不是4位。这给了我们存储4位BCD数的两个选择。我们可以忽略额外位的成本,并用零填充高阶半字节,或强制将每位十进制数字替换为8位。当使用这种方法时,146将存储为00000001 00000100 00000110。显然,这种做法是相当浪费的。第二种方法称为压缩BCD,每字节存储两位数。压缩的十进制格式允许数字有符号,不是将符号放在开始处而是把它存储在最后。这个“符号数字位”的标准值若为1100则代表+,1101代表-,1111表示值为无符号(见表2-5)。使用压缩十进制格式,+146将存储为00010100 01101100。偶数位的数字仍然需要填充。请注意,如果一个数字有一个小数点(与货币值一
表2-5 二进制编码的十进制
样),则它在BCD表示的数字中不存储,应该由应用程序保留。
BCD的另一个变换是区位十进制格式。区位十进制表示在每个字节的低位半字节中存储一个十进制数字,这与非压缩的十进制格式相同。但是,它不使用零的半字节填补高阶,而是使用特定的模式。称为数字区域的高阶半字节有两个选择。EBCDIC区位十进制格式要求该区域全部为1(即十六进制的F)。ASCII区位十进制格式要求区域为0011(十六进制为3)。(有关EBCDIC和ASCII的详细说明,请参阅接下来的两节。)两种格式都允许带有符号数字(使用表2-5中的符号数字),通常期望符号位于最低有效字节的高位半字节(尽管标记可能是一个完整的单独字节)。例如,在EBCDIC区位十进制格式中,+146是1111000111110100 11000110(注意,最后一个字节的高位半字节是符号)。在ASCII区位十进制格式中,+146是00110001 00110100 11000110。
注意表2-5中有6个未使用的可能的二进制值——1010~1111。虽然有将近40%的值浪费了,但我们在准确性上获得了相当大的优势。例如,当以二进制存储时,数字0.3是重复的十进制数。截断到8位分数时,它转换回0.296875,约有1.05%的误差。在EBCDIC区位十进制BCD中,数字直接存储为1111 0011(我们是假设数据格式暗示了小数点),根本不会出任何错误。
例2.37使用压缩BCD和EBCDIC区位十进制分别表示-1265。
1265的4位BCD表示是:
0001 0010 0110 0101
在低阶位后添加符号并在高阶位填充0000,我们有:
EBCDIC区位十进制表示需要4字节:
两个表示中的阴影部分为符号位。
- 点赞
- 收藏
- 关注作者
评论(0)