1.2 码制及其转换
本节介绍计算机主要使用的二进制编码,重点讲解真值(有符号数)与补码(或无符号数)间的快速转换方法。此方法使得8位或16位二进制补码的求解及有无符号数之间的转换变得轻而易举。
1.2.1 BCD码
常见的BCD码有8421码、2421码以及余3码等,一般使用8421码,它又分为压缩BCD码和非压缩BCD码。压缩BCD码是用4位二进制代码表示一位十进制,一个字节可以表示两位十进制(00~9 9);而非压缩BCD码是用8位二进制代码表示一位十进制,高4位无效,一个字节只能表示一位十进制(0~9),高4位为0时则叫标准非压缩BCD码。例如,十进制数35的压缩BCD码为35H,其标准非压缩BCD码为0305H。它们的比较示意图如图1.5所示。
图1.5 三种 8421 BCD码的比较
1.2.2 ASCII码
基本ASCII码使用7位二进制编码,占一个字节,最高位为0。重要的7个字符的ASCII码值如表1.2所示,其他字符参看附录E。
表1.2 重要的ASCII字符
'0'~'9'的ASCII码依次加1,'A'~'Z'的ASCII码依次加1,'a'~'z'的ASCII码也是依次加1,所以记住'0'、'A'以及'a'的ASCII码,也就记住了6 2个字符的ASCII码。'0'~'9'的ASCII码是一种特殊的非压缩BCD码。例如'3 5'是十进制数3 5的非压缩BCD码即3335H。
1.2.3 汉字内码
汉字在计算机及相关设备内存储、处理以及传输所用的编码称为汉字内码。我国目前主要采用的是国标内码(GB2312),它在计算机内占用两个字节,每个字节的最高位为1,最多可表示214=16384个可区别代码。它与国标区位码的计算关系为:国标内码=国标码(十六进制)+8080H=国标区位码(十六进制)+A0A0H。GB2312—80中有:一级汉字3755个、按拼音顺序排列,二级汉字3008个、按偏旁笔画数排列,字符682个。中国香港地区、中国台湾地区以及新加坡等繁体汉字区主要采用大五码(BIG5),它在计算机内也4是占用两个字节,每个字节的最高位也为1。
为了统一表示世界上各国的文字,1993年国际标准化组织公布了“通用多八位编码字符集”的国际标准ISO/IEC10646,简称UCS(Universal Code Set),有时也叫CJK(中、日、韩)统一汉字集。目前世界上逐渐趋于采用国际上通用的UCS中的CJK统一汉字编码技术。UCS用4字节足以表示世界上所有的文字包括英文、中文、日文、韩文、俄文以及法文等。我国的相应标准为GB13000。详细内容请查阅网址http://www.unicode.org。
1.2.4 原码、反码和补码
原码、反码和补码均为有符号数的编码,正、负号也用二进制编码来表示,它们所代表的实际数值称为“真值或原值”。
原码是直接在真值的绝对值之前增加一个符号位,并取正数的符号为0,负数的符号为1。正数的反码、补码与原码相同,负数的反码为原码的符号位不变其他位变反而得,负数的补码为原码的符号位不变其他位变反+1 而得。负数的三种编码之间的转换关系如图1.6所示。
图1.6 负数的原、反、补码之间转换关系图
补码是计算机中最基本的有符号数编码方案,最主要原因是因为采用补码后:减法可变加法如5-3=5+(-3);加减时符号位如同数值位一样参加计算,具体例子请参看第3章加减运算指令。
例1.11(8位二进制数的原、反和补码)
-107=-6BH=-1101011B=11101011B(原)=10010100B(反)=10010101B(补)=EBH(原)=94H(反)=95H(补)
107=6BH(原)=6BH(反)=6BH(补)
1.2.5 二进制数据的表示范围
二进制数据的表示范围要分有符号数还是无符号数。无符号数的所有二进制位(bit)均作为数值位;有符号数的最高位代表符号位,1 代表负、0代表正,其余位才是数值位。n位二进制无符号数的表示范围为0~(2n-1)。n位二进制有符号数的表示范围还取决于编码方案,补码为-2n-1~+(2n-1-1);原码、反码的表示范围为-(2n-1-1)~+(2n-1-1)。计算机中内外存容量以字节(B,Byte)为单位,一个字节由8个二进制位构成(即1 B=8 b)。8位二进制数(1字节)的无符号数表示范围为0~255,有符号补码表示范围为-128~+127;16位二进制(2字节)的无符号数表示范围为0~65535,有符号补码表示范围为-32768~+32767。
1.2.6 真值与补码(无符号数)之间的直接转换
正数的真值与补码(无符号数)完全相同,负数的真值与补码(无符号数)之间的直接转换方法如图1.7所示(0在用n位二进制补码表示时也代表2n)。
例1.12 8位二进制时:
20=14H(补)=20(无)
-5=0-5=00H-05H=FBH(补)=251(无)
-120=0-120=00H-78H=88H(补)=136(无)
F8H(补)=248(无)=-(00H-F8H)=-08H=-(256-248)=-8(有)
5CH(补)=92(无)=92(有)
16位二进制时:
20=0014H(补)=20(无)
-5=0-5=0000H-0005H=FFFBH(补)=65531(无)
-120=0-120=0000H-78H=FF88H(补)=65416(无)
FFC6H(补)=0000H-(0000H-FFC6H)=65536-58=65478(无)=-(0-FFC6H)=-3AH=-58(有)=-(65536-65478)=-58(有)
048FH=1024+128+15=1165(无)=1165(有)
1.2.7 定点数和浮点数
机器数的表示是受设备限制的。计算机一般是以字为单位进行数据的处理、存储和传递的。所以运算器中的加法器,累加器以及其他一些寄存器,都选择与字长相同的位数。字长一定,则计算机所能表示数的范围也就确定了。例如,使用8位字长的计算机,它可以表示无符号整数的表示范围在0~255,补码表示的有符号数表示范围-128~127。如果运算数值超出机器数所能表示的范围,机器就需要进行相应处理。这种现象称为溢出。
计算机中的数,既有整数,也有小数。如何确定小数点的位置呢?通常有两种约定:一种是规定小数点位置固定不变,这时的机器数称为定点数,另一种是小数点位置可以浮动的,这样的机器数称为浮点数。
1.定点数。对于定点数,小数点位置可以固定在符号位之后,这样的机器表示的全是定点小数。例如,假定机器字长为16位,符号位占1位,数值占有15位,于是机器数的原码表示如图1.8所示。
图1.7 负数的真值与补码之间转换关系图
图1.8 定点小数示意图
其相当于十进制数为-2-15。
小数点位置固定在数的最后,则该机器表示的全是定点整数。例如,假设机器字长为16位,符号位占有1位,数值部分占15位,图1.9表示的机器数相当于十进制数为+32767。
图1.9 定点整数示意图
定点表示法表示的数值范围及精度有限,为了扩大定点数的表示范围或提高精度,可以采用多个字节来表示一个定点数,例如,采用4字节或8字节来表示。
2.浮点数。浮点数表示法就是小数点在数中的位置是浮动的。由于定点数表示的数的范围较窄,不能满足实际问题的需要,因此要采用浮点表示法。在同样字长情况下,浮点表示法能表示数的范围扩大了。
浮点表示法包括两部分:一部分是阶码,另一部分是尾数。浮点数在机器中的表示方法如图1.10所示。
图1.10 浮点数示意图
由尾数部分隐含的小数点位置可知,尾数的绝对值总是小于1的数,它给出该浮点数的有效数字,为了有更多位有效数字,一般用规范化小数表示,即尾数的绝对值大于等于0.5、小于1。尾数部分的数符确定该浮点数的正负。阶码总是整数,它确定小数点浮动的位数。若阶符为正,尾数的小数点向右移动;若阶符为负,则向左移动。即浮点数的值为:尾数×2阶码。
当浮点数的尾数为零或者阶码为最小值时,机器通常规定,把该数看做0,称为“机器零”。在浮点数的表示和运算中,当一个数的阶码大于机器所能表示的最大阶码时,产生“上溢”,当一个数的阶码小于机器所能表示的最小阶码时,产生“下溢”。
浮点数的取值范围如图1.11所示。
图1.11 浮点数表示范围示意图
例1.13 设阶码用8位补码表示,尾数部分用16位补码表示,则-128.0625=-(27+2-4)= -(2-1+2-12)×28=-0.100000000001000B×28的尾数部分为-0.100000000001000B,补码为1011111111111000B;阶码部分为8,即00001000B,对应的十六进制数为08BFF8H。