第1章 预备知识(数制与码制) 1.1 进位计数制及各计数制间的转换 1.2 二进制数的运算 第1章 预备知识(数制与码制) 1.1 进位计数制及各计数制间的转换 1.2 二进制数的运算 1.3 带符号数的表示方法—— 原码、反码、补码 1.4 定点数与浮点数 1.5 BCD码和ASCII码
1.1 进位计数制及各计数制间的转换 数制是人们对事物数量计数的一种统计规律。在日常生活中最常用的是十进制,但在计算机中,由于其电气元件最易实现的是两种稳定状态:器件的“开”与“关”;电平的“高”与“低”。因此,采用二进制数的“0”和“1”可以很方便地表示机内的数据运算与存储。在编程时,为了方便阅读和书写,人们还经常用八进制数或十六进制来表示二进制数。虽然一个数可以用不同计数制形式表示它的大小,但该数的量值则是相等的。
1.1.1进位计数制 当进位计数制采用位置表示法时,同一数字在不同的数位所代表的数值是不同的。每一种进位计数应包含两个基本的因素: (1)基数R(Radix):它代表计数制中所用到的数码个数。如:二进制计数中用到0和1两个数码;而八进制计数中用到0~7共八个数码。一般地说,基数为R的计数制(简称R进制)中,包含0、1、…、R-1个数码,进位规律为“逢R进1”。
(2)位权W(Weight):进位计数制中,某个数位的值是由这一位的数码值乘以处在这一位的固定常数决定的,通常把这一固定常数称之为位权值,简称位权。各位的位权是以R为底的幂。如十进制数基数R=10,则个位、十位、百位上的位权分别为100,101,102。 一个R进制数N,可以用以下两种形式表示: (1)并列表示法,或称位置计数法: (N)R=(K n-1 K n-2…K1K0K-1 K -2…K-m)R
(2)多项式表示法,或称以权展开式: (N)R=K n-1 R n-1+K n-2 R n-2+…+K1R1+K0R0+ K-1 R-1+…+K-m R-m= 其中:m、n为正整数,n代表整数部分的位数;m代表小数部分的位数;Ki代表R进制中的任一个数码,0≤Ki≤R-1。 1.二进制数 二进制数,R=2,Ki取0或1,进位规律为“逢2进1”。任一个二进制数N可表示为:
(N)2=K n-1 2 n-1+K n-2 2 n-2+…+K121+K020+K-12-1+…+K-m 2-m (1― 1) 例如:(1001.101)2=1×23+0×22+0×21+1×20+1×2-1+0×2-2 2. 八进制数 八进制,R=8,Ki可取0~7共8个数码中的任意1个,进位规律为“逢8进1”。任意一个八进制数N可以表示为: (N)8=K n-1 8 n-1+K n-2 8 n-2+…+K181+K080+ K-1 8-1+…+K-m 8-m (1―2) 例如:(246.12)8=2×82+4×81+6×80+1×8-1+2×8-2
3.十六进制数 十六进制数,R=16,Ki可取0~15共16个数码中的任一个,但10~15分别用A、B、C、D、E、F表示,进位规律为“逢16进1”。任意一个十六进制数N可表示为: (N)16=K n-1 16 n-1+K n-2 16 n-2+…+K1161+K0160+K-1 16-1+…+K-m 16 –m (1―3) 例如:(2D07.A)16=2×163+13×162+0×161+7×160+10×16 -1
表1―1给出了以上3种进制数与十进制数的对应关系。为避免混淆,除用(N)R的方法区分不同进制数外,还常用数字后加字母作为标注。其中字母B(Binary)表示二进制数;字母Q(Octal的缩写为字母O,为区别数字0故写成Q)表示八进制数;字母D(Decimal)或不加字母表示十进制数;字母H(Hexadecimal)表示十六进制数。
表1―1二、八、十、十六进制数码对应表
1.1.2 各种进制数间的相互转换 1.各种进制数转换成十进制数 各种进制数转换成十进制数的方法是:将各进制数先按权展成多项式,再利用十进制运算法则求和,即可得到该数对应的十进制数。 例1: 将数1001.101B,246.12Q,2D07.AH转换为十进制数。 1001.101B=1×23+0×22+0×21+1×20+1×21+0×2-2+1×2-3 =8+1+0.5+0.125=9.625
246.12Q=2×82+4×81+6×80+1×8-1+2×8-2 =128+32+6+0.125+0.03125=166.15625 2D07.AH=2×163+13×162+0×161+7×160+10×16-1 =8192+3328+7+0.625=11527.625
2.十进制数转换为二、八、十六进制数 任一十进制数N转换成q进制数,先将整数部分与小数部分分为两部分,并分别进行转换,然后再用小数点将这两部分连接起来。 1)整数部分转换 整数部分转换步骤为: 第1步:用q去除N的整数部分,得到商和余数,记余数为q进制整数的最低位数码K0;
第2步:再用q去除得到的商,求出新的商和余数,余数又作为q进制整数的次低位数码K1; 第3步:再用q去除得到的新商,再求出相应的商和余数,余数作为q进制整数的下一位数码Ki; 第4步:重复第3步,直至商为零,整数转换结束。此时,余数作为转换后q进制整数的最高位数码K n-1。
2|168 2|84 余数0, K0=0 2|42 余数0, K1=0 2|21 余数0, K2=0 2|10 余数1, K3=1 2|5 余数0, K4=0 8|168 2|2 余数1, K5=1 8|21余数0, K0=0 16|168 2|1 余数0, K6=0 8|2余数5, K1=516 16 |10余数8, K0=8 0 余数1, K7=1 0余数2 , K2=2 0 余数10,K1=A 168=10101000B 168=250Q 168=A8H
2)小数部分转换 小数部分转换步骤为: 第1步:用q去乘N的纯小数部分,记下乘积的整数部分,作为q进制小数的第1个数码K-1; 第2步:再用q去乘上次积的纯小数部分,得到新乘积的整数部分,记为q进制小数的次位数码K-i; 第3步:重复第2步,直至乘积的小数部分为零,或者达到所需要的精度位数为止。此时,乘积的整数位作为q进制小数位的数码K-m。
例3: 将0.686转换成二、八、十六进制数(用小数点后5位表示)。 0.686×2=1.372K-1=1 0.686×8=5.488K-1=5 0.686×16=10.976K-1=A 0.372×2=0.744K-2=0 0.488×8=3.904K-2=3 0.976×16=15.616K-2=F 0.744×2=1.488K-3=1 0.904×8=7.232K-3=7 0.616×16=9.856K-3=9 0.488×2=0.976K-4=0 0.232×8=1.856K-4=1 0.856×16=13.696K-4=D 0.976×2=1.952K-5=1 0.856×8=6.848K-5=6 0.696×16=11.136K-5=B 0.686≈0.10101B 0.686≈0.53716Q 0.686≈0.AF9DBH
例4: 将168.686转换为二、八、十六进制数。根据例2、例3可得: 168.686≈10101000.10101B 168.686≈250.53716Q 168.686≈A8.AF9DBH
从以上例子可以看出,二进制表示的数愈精确,所需的数位就愈多,这样,不利于书写和记忆,而且容易出错。另外,若用同样数位表示数,则八、十六进制数所表示数的精度较高。所以在汇编语言编程中常用八进制或十六进制数作为二进制数的缩码,来书写和记忆二进制数,便于人—机信息交换。在MCS-51系列单片机编程中,通常采用十六进制数。
3.二进制数与八进制数之间的相互转换 由于23=8,故可采用“合3为1”的原则,即从小数点开始分别向左、右两边各以3位为1组进行二—八换算;若不足3位的以0补足,便可将二进制数转换为八进制数。 例5: 将1111011.0101B转换为八进制数。 解: 根据“合3为1”和不足3位以0补足的原则,将此二进制数书写为: 001 111 011 . 010 100 1 7 3 . 2 4 因此,其结果为1111011.0101B=173.24Q。
例6: 将1357.246Q转换成二进制数。 解: 根据“1分为3”的原则,可将该十进制数书写为: 1 3 5 7 . 2 4 6 001 011 101 111 .010 100 110 其结果为1357.246Q=1011101111.01010011B。 4.二进制数与十六进制数之间的相互转换 由于24=16,故可采用“合4为1”的原则,从小数点开始分别向左、右两边各以4位为1组进行二—十六换算;若不足4位以0补足,便可将二进制数转换为十六进制数。
例7: 将1101000101011.001111B转换成十六进制数。 解: 根据“合4为1”的原则,可将该二进制数书写为: 0001 1010 0010 1011 .0011 1100 1 A 2 B . 3 C 其结果为1101000101011.001111B=1A2B.3CH。 反之,采用“1分为4”的原则,每位十六进制数用4位二进制数表示,便可将十六进制数转换为二进制数。
例8: 将4D5E.6FH转换成二进制数。 解: 根据“1分为4”的原则,可将该十六进制数书写为: 4 D 5 E . 6 F 0100 1101 0101 1110 . 0110 1111 其结果为4D5E.6FH=100110101011110.01101111B。
1.2 二进制数的运算 1.2.1二进制数的算术运算 二进制数不仅物理上容易实现,而且算术运算也比较简单,其加、减法遵循“逢2进1”、“借1当2”的原则。 以下通过4个例子说明二进制数的加、减、乘、除运算过程。 1. 二进制加法 1 位二进制数的加法规则为: 0+0=0 0+1=1 1+0=1 1+1=10 (有进位)
例1: 求11001010B+11101B。 解: 被加数 11001010 加数 11101 进位 +) 00110000 和 11100111 则11001010B+11101B=11100111B。 由此可见,两个二进制数相加时,每1位有3个数参与运算(本位被加数、加数、低位进位),从而得到本位和以及向高位的进位。
2. 二进制减法 1位二进制数减法规则为: 1-0=1 1-1=0 0-0=0 0-1=1 (有借位) 例2: 求10101010B-10101B。 解: 被减数 10101010 减数 10101 借位 -) 00101010 差 10010101 则10101010B-10101B=10010101B。
3.二进制乘法 1 位二进制乘法规则为: 0×0=0 0×1=0 1×0=0 1×1=1 例3: 求110011B×1011B。 解: 被乘数 110011 乘数 ×) 1011 110011 000000 +) 110011 积 1000110001
则110011B×1011B=1000110001B。 由运算过程可以看出,二进制数乘法与十进制数乘法相类似,可用乘数的每1位去乘被乘数,乘得的中间结果的最低有效位与相应的乘数位对齐,若乘数位为1,则中间结果为被乘数;若乘数位为0,则中间结果为0,最后把所有中间结果同时相加即可得到乘积。显然,这种算法计算机实现时很不方便。对于没有乘法指令的微型计算机来说,常采用比较、相加、与部分积右移相结合的方法进行编程来实现乘法运算。
4.二进制除法 二进制除法的运算过程类似于十进制除法的运算过程。 例4: 求 100100B÷101B。 解: 000111 101 100100 101 1000 110 1
则100100B÷101B=111B,余1B。 二进制数除法是二进制数乘法的逆运算,在没有除法指令的微型计算机中,常采用比较、相减、余数左移相结合的方法进行编程来实现除法运算。由于MCS-51系列单片机指令系统中包含有加、减、乘、除指令,因此给用户编程带来了许多方便,同时也提高了机器的运算效率。
1.2.2 二进制数的逻辑运算 1.“与”运算(AND) “与”运算又称逻辑乘,运算符为·或∧。“与”运算的规则如下: 0·0=0 0·1=1·0=0 1·1=1 例5: 若二进制数X=10101111B,Y=01011110B,求 X·Y。 10101111 ∧ 01011110 00001110 则X·Y=00001110B。
2. “或”运算(OR) “或”运算又称逻辑加,运算符为+或∨。“或”运算的规则如下: 0+0=0 0+1=1+0=1 1+1=1 例6: 若二进制数X=10101111B,Y=01011110B,求X +Y。 10101111 ∨ 01011110 11111111 则X+Y=11111111B。
3.“非”运算(NOT) “非”运算又称逻辑非,如变量A的“非”运算记作 。“非”运算的规则如下: 例7: 若二进制数A=10101111B,求 。 = =01010000B 由此可见,逻辑“非”可使A中各位结果均发生反变化,即0变1,1变0。
4.“异或”运算(XOR) “异或”运算的运算符为或,其运算规则如下: 0 0=0 0 1=1 0=1 1 1=0 例8: 若二进制数X=10101111B,Y=01011110B,求 X Y。 10101111 01011110 11110001 则X Y=11110001B。
1.3 带符号数的表示方法—— 原码、反码、补码 1.3.1 机器数与真值 1.3 带符号数的表示方法—— 原码、反码、补码 1.3.1 机器数与真值 在1.2.1、1.2.2节中讨论的二进制数运算均为无符号数运算,但实际的数值是带有符号的,既可能是正数,也可能是负数,前者符号用“+”号表示,后者符号用“-”号表示,运算的结果也可能是正数,也可能是负数。于是在计算机中就存在着如何表示正、负数的问题。
例如:N1=+1011, N2=-1011在计算机中用8位二进制数可分别表示为: 由于计算机只能识别0和1,因此,在计算机中通常把一个二进制数的最高位作为符号位,以表示数值的正与负(若用8位表示一个数,则D7位为符号位;若用16位表示一个数,则D15位为符号位),并用0表示“+”;用1表示“-”。 例如:N1=+1011, N2=-1011在计算机中用8位二进制数可分别表示为: D7 D6 D5 D4 D3 D2 D1 D0 0001011 符号 数值部分
正数的符号位用0表示,负数的符号位用1表示,数值部分用真值的绝对值来表示的二进制机器数称之为原码,用[X]原表示。 D7 D6 D5 D4 D3 D2 D1 D0 1 0001011 符号 数值部分 1.3.2原码、补码与反码 1.原码 正数的符号位用0表示,负数的符号位用1表示,数值部分用真值的绝对值来表示的二进制机器数称之为原码,用[X]原表示。 (1)正数的原码。
若真值为正数X=+K n-2 K n-3…K1K0(即n-1位二进制正数), 2) 负数的原码。 若真值为负数X=-K n-2 K n-3…K1K0(即n-1位二进制负数), 则[X]原= 0K n-2 K n-3…K1K0 =2 n-1+ K n-2 K n-3…K1K0 = 2 n-1 -(-K n-2 K n-3…K1K0) = 2 n-1 -X (1―5)
例如:+115和-115在计算机中(设机器字长为8位),其原码可分别表示为: [+115]原=01110011B;[-115]原=11110011B (3)零的原码。 若真值为零,则原码有两种表示法: [+0]原=000…00 [-0]原=100…00 由此可得原码与真值的关系为 X, 0≤X<2n 2 n-1-X -2n<X≤0 (1―6) [X]原=
2. 补码与反码 1)补码的概念 在日常生活中有许多“补”数的事例。如钟表,假设标准时间为6点整,而某钟表却指在9点,若要把表拨准,可以有两种拨法,一种是倒拨3小时,即9-3=6;另一种是顺拨9小时,即9+9=6。尽管将表针倒拨或顺拨不同的时数,但却得到相同的结果,即9-3与9+9是等价的。这是因为钟表采用12小时进位,超过12就从头算起,即:9+9=12+6,该12称之为模(mod)。
模(mod)为一个系统的量程或此系统所能表示的最大数,它会自然丢掉,如: 通常称+9是-3在模为12时的补数。于是,引入补数后使减法运算变为加法运算。 例如: 11-7=11+5→4 (mod12) +5是-7在模为12时的补数,减7与加5的效果是一样的。
一般情况下,任一整数X,在模为K时的补数可用下式表示: [X]补数=X+K(modK) X 0≤X<K K-|X| -K≤X≤0 (1―7) =
由补码的概念引伸,当用n位二进制数表示整数X(1位为符号位,n-1位为数值位),模为2n时,数X的补码可表示为: X 0≤X<2 n-1 2n+X -2 n-1≤X≤0 [X]补= (mod2n) (1―8)
从式(1―8)可见: ①正数的补码与其原码相同,即[X]补=[X]原; ②零的补码为零,[+0]补=[-0]补=000…00; ③负数才有求补码的问题。 2)负数补码的求法 补码的求法一般有两种: ①用补码定义式: [X]补=2n+X=2n-|X| -2 n-1≤X≤0(整数) (1―9)
在用补码定义式求补码的过程中,由于做一次减法很不方便,故该法一般不用。 例如:X=-0101111B, n=8,则 [X]补=28+(-0101111B) =100000000B-0101111B =11010001B(mod28) ②用原码求反码,再在数值末位加1可得到补码,即:[X]补=[X]反+1。
3) 反码 一个正数的反码,等于该数的原码;一个负数的反码,等于该负数的原码符号位不变(即为1),数值位按位求反(即0变1,1变0);或者在该负数对应的正数原码上连同符号位逐位求反。反码用[X]反表示。 X 0≤X<2 n-1 (2n-1)+X -2 n-1<X≤0 (1―10) [X]反=
从式(1―10)可见: ①正数的反码:[X]反=[X]原; ②负数的反码:[X]反= ③零的反码:[+0]反=000…00 [-0]反=111…11 例1: 假设X1=+83, X2=-76,当用8位二进制数表示一个数时,求X1、X2的原码、反码及补码。 解: [X1]原=[X1]反=[X1]补=01010011B [X2]原=11001100B
[X2]反=10110011B [X2]补=[X]反+1=10110100B 综上所述可归纳为: 正数的原码、反码、补码就是该数本身; 负数的原码其符号位为1,数值位不变; 负数的反码其符号位为1,数值位逐位求反; 负数的补码其符号位为1,数值位逐位求反并在末位加1。
1.3.3 补码的运算规则与溢出判别 1. 补码的运算规则 补码的运算规则如下: 1)[X+Y]补=[X]补+[Y]补 该运算规则说明:任何两个数相加,无论其正负号如何,只要对它们各自的补码进行加法运算,就可得到正确的结果,该结果是补码形式。
2)[X-Y]补=[X]补+[-Y]补 该运算规则说明:任意两个数相减,只要对减数连同“-”号求补,就变成[被减数]补与[-减数]补相加,该结果是补码形式。 3)[[X]补]补=[X]原 对于运算产生的补码结果,若要转换为原码表示,则正数的结果[X]补=[X]原;负数结果,只要对该补结果再进行一次求补运算,就可得到负数的原码结果。
例2: 用补码求X+Y。 解: 若[X]补=00100101, [Y]补=00110011,可得 [X+Y]补=[X]补+[Y]补 =00100101+00110011=01011000 由于符号位为0是正数,所以 [X+Y]原=[X+Y]补=01011000 则 X+Y=(01011000)2=+88
例3: 用补码求X-Y。 解: 若[-Y]补=11001101,可得 [X-Y]补=[X]补+[-Y]补 =00100101+11001101=11110010 由于符号位为1是负数,所以 [X-Y]原=[[X-Y]补]补=10001110 则 X-Y=-(00001110)2=-14
例4: 用补码求Y-X。 解: 若[-X]补=11011011,可得 [Y-X]补=[Y]补+[-X]补 =00110011+11011011=100001110 (模28自然丢失) 则 Y-X=(00001110)2=+14
例5: 用补码求(-X)+(-Y)。 解: [(-X)+(-Y)]补=[-X]补+[-Y]补 =11011011+11001101=110101000 (模28自然丢失) [(-X)+(-Y)]原=[(-X)+(-Y)补]补=11011000 则(-X)+(-Y)=-(01011000)2=-88 上述运算结果是正确的,但有时在补码运算中可能会出现错误的结果,请看下面例子。
例6: 设X=+100,Y=+50,用补码运算求X+Y,(-X)+(-Y)。
2. 溢出的判别 计算机中判别溢出的方法通常采用双高位判别法。双高位判别法利用符号位(K n-1位) 及最高数值位(K n-2位)的进位情况来判断是否发生了溢出。为此,需引进两个符号:CS和CP。 CS :若符号位发生进位,则CS =1;否则CS =0。 CP :若最高数值位发生进位,则CP =1;否则CP =0。
当两个正数补码相加时,若数值部分之和大于2n-1,则数值部分必有进位CP=1;而符号位却无进位CS=0。这时CSCP的状态为“01”,发生正溢出。 当两个负数补码相加时,若数值部分绝对值之和大于2n-1,则数值部分补码之和必小于2n-1,CP=0;而符号位肯定有进位CS=1,这时CSCP的状态为“10”,发生负溢出。 当不发生溢出时,CS和CP的状态是相同的,即CSCP的状态为“00”或“11”。
例 7: 01011001 (+89) 10010010 (-110) 01101100 (+108) 10100100 (-92) +)011110000 (进位) +)1 00000000 (进位) 011000101 (-59) 1 00110110 (+54) CS=0,CP=1,正溢出 CS=1,CP=0,负溢出
例8: 00110010 (+50) 11101100 (-20) 01000110 (+70) 11100010 (-30) +)0 00001100 (进位) +)1 11000000 (进位) 0 01111000(+120) 1 11001110(-50) CS=0,CP=0,无溢出 CS=1,CP=1,无溢出
例9: 01010101 (+85) 10111100 (-68) 11011101 (-35) 00011101 (+29) +)1 10111010 (进位) +)0 01111000 (进位) 1 00110010(+50) 0 11011001(-39) CS=1,CP=1,无溢出 CS=0,CP=0,无溢出
综上所述,对计算机而言,补码的引入使带符号数的运算都按加法处理。如果CS和CP的值相等,则表示运算结果正确,没有溢出,运算结果的正与负由符号位决定(如例8、例9);如果CS和CP的值不等,则表示运算结果不正确,发生了溢出现象(如例7)。 在计算机中,常用“异或”电路来判别有无溢出发生,即CSCP=1表示有溢出发生,否则无溢出发生。
1.4 定点数与浮点数 1.4.1 定点表示法 在计算机中,如将小数点的位置固定不变,称为定点表示法。这个固定的位置是事先约定好的,不必用符号表示。用定点法表示的实数叫做定点数。通常,定点表示采用以下两种方法。
小数点固定在最低数值位之后,机器中能表示的所有数都是整数,这种方法称之为定点整数表示法。其格式如下: 1. 定点整数表示法 小数点固定在最低数值位之后,机器中能表示的所有数都是整数,这种方法称之为定点整数表示法。其格式如下: 符号位 数 值 位 其中“.”为设定的小数点位置 当用n位表示数N时,1位为符号位,n-1位为数值位, 则N的范围是: -2 n-1≤N≤2 n-1-1 (1―11)
例如: 若N=+1011011,n=8,则在计算机内用定点整数法可将N表示为: 若n=8,则-128≤N≤127;若n=16,则-32768≤N≤32767。 例如: 若N=+1011011,n=8,则在计算机内用定点整数法可将N表示为: 1 0 1 1 0 1 1
小数点固定在最高数值位之前,机器中能表示的所有数即为纯小数,这种方法称之为定点小数表示法。其格式如下: 2. 定点小数表示法 小数点固定在最高数值位之前,机器中能表示的所有数即为纯小数,这种方法称之为定点小数表示法。其格式如下: 符号位 数 值 位 其中“.”为设定的小数点位置。 当用n位表示数N时,1位为符号位,n-1位为数值位, 则N的范围是: -(1-2 1-n)≤N≤1-2 1-n (1―12)
例如:若N=-0.1011011,n=8,则在计算机内用定点小数法可将N表示为: 1 0 1 1 0 1 1
1.4.2 浮点表示法 在计算机中,小数点位置并不是固定不变的,而是可以改变的,这种表示法称为浮点表示法。用浮点法表示的实数,叫做浮点数。 任意一个二进制数N可以表示成如下形式: N=±M·2±E (1―13) 称作数符,表示数的正、负;E称为阶码,它前面的符号称为阶符,指明尾数小数点向右或向左浮动的方向,而阶码E指明尾数小数点移动的位数,所以阶符和阶码表明了数值N小数点的位置。
设阶码E的位数为m位,尾数M的位数为n位,则浮点数N的取值范围为: 2 -n·2 -(2m-1)≤|N|≤(1-2-n)·2(2m-1) (1―14) 例如:对16位表示的浮点原码数,当m=7,n=7时,它所能表示的最大绝对值为: |N|max=(1-2-n)·2(2m-1) =(1-2-7)·2(27-1)≈2127 它所能表示的除0以外的最小绝对值为: |N|min=2-n·2-(2m-1)=2-7·2-(27-1) =2-134 (1―15)
由此可见,由于浮点数能表示的数值范围很大,因此,在科学计算时不需要比例因子。为了提高精度,发挥尾数有效位的最大作用,还规定二进制浮点数其尾数数字部分原码的最高位为1,叫做规格化表示法。如:0.0010101可表示为2-2×0.1010100称为规格化浮点数。
1.5 BCD码和ASCII码 1.5.1 BCD码(BinaryCodedDecimal)
1位十进制数有0~9共10个不同数码,需要由4位二进制数来表示。4位二进制数有16种组合,取其10种组合分别代表10个十进制数码。最常用的方法是8421BCD码,其中8、4、2、1分别为4位二进制数的位权值。表1―2给出了十进制数和8421BCD码的对应关系。
表 1―28421BCD码
从表1―2中可看出8421BCD码与十进制数关系直观,二—十间相互转换容易。 例如:将78.43转换成相应的BCD码,而将 (01101001.00010101)BCD转换成十进制数。 78.43=(0111 1000.0100 0011)BCD (0110 1001.0001 0101)BCD=69.15
1.5.2 BCD码运算及十进制调整 若想让计算机直接用十进制的规律进行运算,则将数据用BCD码来存储和运算即可。 例如:4+3即:(0100)BCD+(0011)BCD=(0111)BCD=7 15+12即:(00010101)BCD+(00010010)BCD =(00100111)BCD=27
但是,8421BCD码可表示数的范围为0000~1111(即十进制的0~15),而十进制数为0000~1001(即0~9)。所以,在运算时,必须注意以下两点: ①当两个BCD数相加结果大于1001(即大于十进制数9)时,为使其符合十进制运算和进位规律,需对BCD码的二进制运算结果加0110(加6)调整。 例如: 4+8(0100)BCD+(1000)BCD=(1100)BCD>1001, 调整后,其结果为:(1100)BCD+(0110)BCD=(00010010)BCD=12。
②当两个BCD数相加结果在本位上并不大于1001,但有低位进位发生,使得两个BCD数与进位一起相加,其结果大于1001,这时也要作加0110(加6)调整。
01010100 +) 01001000 10011100 (低4位大于9) +) 0110 (低4位加6调整) 10100010 (低4位有进位) +) 0110 (高4位加6调整) 000100000010 则(000100000010)BCD=102
1.5.3 ASCII码与奇偶校验 在计算机的应用过程中,如操作系统命令,各种程序设计语言以及计算机运算和处理信息的输入输出,经常用到某些字母,数字或各种符号,如:英文字母的大、小写;0~9数字符;+、-、*、/运算符;<、>、=关系运算符等等。但在计算机内,任何信息都是用代码表示的,因此,这些符号也必须要有自己的编码。
ASCII码采用7位二进制数对字符进行编码,它包括10个十进制数0~9;大写和小写英文字母各26个;32个通用控制符号;34个专用符号,共128个字符。其中数字0~9的ASCII编码分别为30H~39H,英文大写字母A~Z的ASCII编码从41H开始依次编至5AH。ASCII编码从20H~7EH均为可打印字符,而00H~1FH为通用控制符,它们不能被打印出来,只起控制或标志的作用,如0DH表示回车(CR),0AH表示换行控制(LF),04H(EOT)为传送结束标志。