1.3 微型计算机的码制和编码
数据是计算机的处理对象,在计算机中常采用基2码进行编码,它包括数值数据和非数值数据两类。数值数据可分为有符号数和无符号数,有符号数又有正、负之分。另外,数值数据还有整数和小数之分。本节重点对数据的表示问题进行讨论。
1.3.1 微型计算机中数的表示方法
1.机器数与真值(数的符号表示)
在计算机所处理的数据中,将无正、负意义的数称为无符号数。而算术运算中的数存在正负之分,这类数称为带符号数,通常规定一个数的最高位为其符号位。其中,带符号数的正号(+)、负号(–)采用“0”和“1”来表示,“0”表示正数的符号,“1”表示负数的符号。
例如,8位二进制数,计算机一般用D7位来表示其符号,如
在上述表示方法中,D7为0表示数据为正,为1表示数据为负。
例如,有符号二进制数+110101B和–110101B在计算机中分别表示为0110101B和1110101B。
为了区别原来的数与它在计算机中的表示形式,通常将符号位和数值位一起作为一个数,称为机器数,机器数能被计算机正确识别,而数据的实际数值称为机器数的真值。
2.小数的表示
在计算机中,小数点通常采用两种方法来表示,即定点表示法和浮点表示法。
(1)定点表示法
定点表示法指小数点在数中的位置是固定不变的,这样在计算机中数的小数点是隐含的。一个二进制数可以写成如式(1-2)所示的形式:
N=S×2J (1-2)
式中 J——二进制整数,称为数N的阶码;
2——阶码的底;
S——为尾数,为K位二进制小数,是N的全部有效数字。
例如,1011.101B=0.1011101×2100。
式(1-2)也可以表示如下:
J指明了小数点的位置,当J=K时,定点数为整数,即小数点被固定在数值位最低有效位之后。
例9 1011.101B=0.1011101×2100,
在该表达式中,J=4,而K=7,为了化成定点整数,将表达式右侧二进制数再右移3位,即为1011.101B=0.0001011101×2111。若字长8位,则数值部分取0001011。
当J=0时,定点数就是定点小数。
例10 0.00010111×211=0.10111×20
这时J=0,此数字就是定点小数。
J码固定不变的二进制数的表示法称为定点表示法,这样的数为定点数,机器称为定点机。
(2)浮点表示法
浮点表示法是指小数点在数中的位置是浮动可变的。由于计算机不能识别小数点“.”,所以用J来表示数据中的小数点的位置,J称为浮点数的阶码,阶码包括阶码的符号(又称阶符)Jf和阶码JM两部分。尾数S包括尾数符号Sf和尾数SM两部分。SM通常采用定点小数形式表示,它决定了浮点数的精度。计算机中,浮点数的表示如下:
例11 已知采用十六位二进制数表示一个浮点数,阶码占5位,尾数和数符占11位。把实数84.375表示为浮点数。
解:84.375=1010100.011B=0.1010100011×2+111
阶码J=+111,尾数S=0.1010100011,尾数符号为0,则浮点形式为
1.3.2 微型计算机中的原码、反码和补码
二进制数据的正、负可以用一位二进制的“0”和“1”两个状态来表示。计算机对数据进行运算时,直接对其符号位进行计算得到的是错误的结果,因此为了简化对二进制数值数据的算术运算,需要对二进制数据进行编码表示,常用的编码有原码、反码和补码。为了讨论方便,首先引入两个概念:机器数和真值。
机器数:带符号的二进制数值数据在计算机内部的编码;
真值:机器数所代表的实际值。
(1)原码
设真值为X,机器字长为n位,则二进制数X的原码定义为:
从式(1-3)可知:一个数的原码就是该数的机器数,它的最高位为符号位,且用“0”表示正,用“1”表示负,其余各位为数值位。因此,二进制正、负数的原码就是符号化的机器数真值本身。例如,长度为8的机器数,若X≥0,则[+0]原=00000000,[+1]原=00000001,[+127]原=01111111;若X≤0,则[–0]原=10000000,[–1]原=10000001,[–127]原=11111111。
例12 已知X=+1110010B,Y=–11011B,求X、Y的原码(机器字长为8位)。
解:由式(1-3)得
[X]原=01110010B;[Y]原=10011011B
例13 已知[X]原=01010011B,[Y]原=10101100B,求X和Y的真值。
解:由式(1-3),已知原码求真值时,只需用“+”、“–”分别取代符号位中的“0”和“1”即可。因此有,X的真值为+1010011B;Y的真值为–101100B。
(2)反码
设真值为X,机器字长为n位,则二进制数X的反码定义为:
从式(1-4)可知:对于正数,其反码就是该数的原码;对于负数,其反码就是机器数符号位保持不变,其余按位取反。例如,长度为8的机器数,若X≥0,则[+0]反=00000000,[+1]反=00000001,[+127]反=01111111;若X≤0,则[–0]反=11111111,[–1]反=11111110,[–127]反=10000000。8位二进制数反码的数值取值范围为–127~+127,16位二进制数反码的数值范围为–32767~+32767。
例14 已知X=+11010B,Y=–100010B,求X和Y的反码(机器字长为8位)。
解:由式(1-4)得
[X]反=[X]原=00011010B
[Y]反=11011101B
例15 已知[X]反=01111101B,[Y]反=11111111B,求X和Y的真值。
解:求解思路是根据原码与真值之间的关系,先求出原码,然后求真值。
根据X和Y的反码值,知
X≥0,则[X]原=[X]反,X的真值为+1111101B,即+125。
Y≤0,则[Y]原=10000000B,Y的真值为–0000000B,即0。
(3)补码
设真值为X,机器字长为n位,则二进制数X的补码定义为:
从式(1-5)可知:对于正数,其补码就是该数的原码;对于负数,其补码就是机器数符号位保持不变,其余按位取反后末位加1。例如,长度为8的机器数,若X≥0,则[+0]补=00000000,[+1]补=00000001,[+127]补=01111111;若X≤0,则[–0]补=00000000,[–1]补=11111111,[–127]补=10000001。
求二进制数的补码时应注意:
(1)在补码表示法中,0只有一种表示,即000…000;
(2)对于10000000这个补码编码,其真值被定义为–128;
(3)负数的补码再取补码等于原码。
例16 已知X=+48D,Y=–48D,机器字长n=8位,求X和Y的补码。
解:首先将+48D转换为二进制数+110000B。由于机器字长是8位,符号位占1位,所以其数值占7位。再根据正数的补码等于原码,得
[X]补=00110000B
将Y写成二进制数,有Y=-110000B。为求Y的补码,首先求Y的原码,得[Y]原=10110000B。
再根据式(1-5),得Y的补码为[Y]补=11010000B。
例17 已知[X]补=00011001,[Y]补=11111111,求X和Y的真值。
解:由于X≥0,所以[X]原=[X]补=00011001B,X的真值为+0011001B,即+25。
由于Y≤0,所以[Y]反=[Y]补–1=11111111–1=11111110B,因此[Y]原=10000001,Y的真值为–0000001B,即–1。
综合来讲,一个有符号数究竟采用何种形式的机器数,必须事先约定;对微型计算机系统来讲,一般采用补码形式表示机器数。将有符号数采用补码形式表示后,其符号位可以直接参与运算,从而使运算器的结构简化,降低了机器成本。
1.3.3 微型计算机的二进制编码
计算机不仅要处理数值数据,而且还要处理大量的非数值数据,如英文大写字母A~Z,标点符号、汉字、专用符号、非数据性数码(如电话号码),而计算机在信息处理过程中只能识别二进制数,二进制数又只有“0”和“1”两个数,仅用0和1表示非数值数据存在困难,因此二进制编码应运而生。二进制编码的实质就是用一组二进制数来表示字母、字符和数码。
1.字符编码
目前,在微型计算机中,使用最多、最普遍的编码形式是ASCII字符编码,即美国标准信息交换码(American Standard Code for Information Interchange,ASCII)。
ASCII的编码方法为:把所有可显示的字符(数字0~9,大、小写英文字母等)和控制字符(换行、回车等)共计128个,排列成16行×8列的表格,字符与其位置一一对应,它的编码便用它所在的列号和行号的七位二进制编码表示,其格式为:
奇偶校验是一种检查信息在传送过程中是否出错的方法。奇偶校验位是0还是1取决于要传送的信息中所包含1的总个数,可分为奇校验和偶校验。
奇校验:所传送的信息连同校验位一起使得1的总个数为奇数。
偶校验:所传送的信息连同校验位一起使得1的总个数为偶数。
ASCII字符编码如表1-2所示。
ASCII码表有以下几个特点。
①每个字符用7位基2码表示,其排列次序为B6,B5,B4,B3,B2,B1,B0。一个字符用一个字节(8位)表示,一般情况下其最高位为“0”,即B7为“0”,当需要奇偶校验时,其最高位用作校验位。
表1-2 ASCII字符编码
表1-2中的部分符号意义说明如表1-3所示。
表1-3 表1-2中的符号
②ASCII码共编码了128个字符,分别是:
a.32个控制字符,主要用于通信中的通信控制或对计算机设备的功能控制,编码为0~31(十进制);
b.间隔字符(也称空格字符)SP,编码值为20H;
c.删除控制码DEL,编码值为7FH;
d.94个可印刷字符(或称有形字符),其编码规律如下。
- 字符0~9这10个数字符号的高3位编码都为011,低4位为0000~1001,屏蔽掉高3位的值,低4位正好是数据0~9的二进制形式,因此数字符号的ASCII码与其本身相差30H,这样既满足排序要求,也有利于与二进制码之间的转换。
- 英文字母的编码值符合A~Z或a~z正常的字母排序关系。大、小写字母编码的B5位值不相同,若B5为0,则表示大写字母;若B5为1,则表示小写字母,这样便于大、小写字母之间的编码转换。
2.8421BCD码
8421BCD(Binary Coded Decimal)码是二进制编码的十进制数,它的实质是将十进制数码0~9分别用四位二进制数来表示。四位二进制码的位权从高到低分别为8,4,2,1,选择的是0000,0001,0010,…,1001这10种组合,如表1-4所示。
表1-4 8421 BCD码与十进制数码的对照表
例18 将十进制数67.9转换成BCD码。
解:转换过程如下:
因此有(67.9)10=(01100111.1001)BCD。
注意:如果给出BCD码对应的十进制数的二进制数表达,则转换方法与例18可逆。
3.汉字的编码
计算机处理的汉字必须采用基2码进行编码。汉字编码遵循“GB2312—80”(通用汉字字符集及其交换标准)方案,该标准按汉字使用的频度,将汉字分为高频字(约100个)、常用字(约3000个)、次常用字(约4000个)、罕见字(约8000个)、死字(约45000个)。汉字字符集是将高频字、常用字和次常用字归结在一起共6763个。再将其分为一级汉字3755个(按拼音排序)、二级汉字3008个(按部首排序),还有字母、数字、图形符号等约700多个。汉字编码一般采用两个字节即16位二进制数,但由于汉字的特殊性,所以在汉字的输入、存储、输出过程中所使用的汉字编码是不一样的,即输入时有输入编码,存储时有汉字机内码,输出时有汉字字形编码。
(1)汉字输入编码
在键盘上输入的各种汉字编码又称外码,常用的输入码有国标区位码、拼音码、首尾码和拼形码等,采用何种编码取决于用户选用的输入法,同一汉字的输入法不同,编码也不同。以国标区位码对“雹”字进行编码为例,其区码为17,位码为02,则它的区位码就为1702。将其变成十六进制后为1102H,再分别加上20H(2020H)后就转换成国标码,得
国标区位码:2020H+1102H=3122H;
内码:8080H+3122H=B1A2H。
(2)汉字机内码
汉字机内码也称汉字内部码,简称内码,它是机器存储和处理汉字时采用的统一编码。每个汉字的机内码是唯一的,用两个字节表示。为了避免与西文字符的ASCII码之间产生二义性,汉字机内码中两个字节的最高位均规定为“1”。
(3)汉字字形码
汉字字形码也叫汉字字模点阵码,用以显示和打印汉字的点阵码,由一串二进制码按序存放在存储器中而得到。在汉字处理过程中,由汉字字模库起始地址和给出的内码,计算出字模数据地址,将其取出并送往显示缓冲区,经变换后送打印和显示。而16×16点阵汉字需32个字节码;24×24点阵汉字为72字节码;ASCII字符点阵为8×8需8个字节码。