1、11.2 计算机中数的表示方法与编码计算机中数的表示方法与编码一、 进位计数制在计算机系统中,采用的是二进制计数,而在日常生活中,我们熟知的是十进制计数,我们首先介绍进位计数的有关概念。十进制计数大约公元 400 年,印度人发明了十进制计数,这可能与我们的手指有关。公元 800 年,阿拉伯人开始使用十进制计数,后来又传入欧洲,十进制计数有以下特点:1 有十个相互独立的数字:0,1,2,3,4,5,6,7,8,9;2 逢十进一;3 权为 10n任一十进制数:N=n-1n-210.-1-2-mN=n-110n-1+n-210n-2+ +1101+0100+-110-1+-210-2+ +-m10-
2、m 二进制计数(用 B 表示)计算机中普遍采用二机制计数,其特点为:1有两个独立的数字:0 和 1 ;2逢二进一;3权为 2n;任一二进制数: N=n-1n-210.-1-2-mN=n-12n-1+n-22n-2+ +121+020+2-12-1+-22-2+ +-m2-m如: 11111111.1=1 27+1 26+1 25+1 24+1 23+1 22+1 21+1 20+1 2-1=128+64+32+16+8+4+2+1+0.5=255.5 十六进制计数(用 H 表示)特点: 十六个独立的数字:0 1 2 3 4 5 6 7 8 9 A B C D E F;逢十六进一;权为十六;任一
3、十六进制数: N=n-1n-210.-1-2-mN=n-1 16n-1+n-2 16n-2+ +1 161+0 160+-116-1+-216-2+ +-m16-m如:3E8H=3162+1416 + 8 = 1000十六进制数本质上可以说与二进制数相同,将二进制数按四位划分,有:二进制数十六进制数十进制数00000000011100102200113301004401015501106601117731000881001991010A101011B111100C121101D131110E141111F15因此,同一个数有多种表示方法,一定要注明采用什么数制,否则,容易引起误解,如:11十进
4、制数为:11二进制数为:3表示为:11B十六进制为:3二、 数制之间的转换主要是二进制和十进制之间的转换, 因为十六进制可以很方便地转化成二进制。二进制转十进制前面已经讲过,下面主要讲十进制转二进制。对十进制整数十进制整数,采用方法:除二取余法:如:53532=26余1262=13余0132=6余1462=3余032=1余112=0余1由此得到:53=110101B(注意:后面的余数为高位)对十进制小数,则采用乘二取整法:如:0.3750. 3752=0.75取整数部分00. 752=1.5取整数部分10. 52=1取整数部分1由此得到:十进制数 0.375=0.011B(取数高位到地位顺序是
5、按乘数的先后顺序)混合数则分别按整数部分和小数部分计算.如:53.375=110101.011B三、 计算机中的数和编码前面我们讨论的都是无符号数,有符号数在计算机中如何表述了?十进制中,用符号正负来表示:+4,4。1.带符号数的表示方法用最高位来表示符号,0 表示为正数,1 表示为负数。有三种表示方法:原码 反码和补码。原码:原码:数值用绝对值表示,符号用最高位来表示, “0” 表示为正数, “1” 表示为负数。5正数的原码是该数的二进制表示:如:+ 4=00000100负数的原码将其符号位变成 1 即可。 4=10000100八位二进制有符号数原码能表示的范围是:正数 0000 0000
6、0111 1111 ,即:+0+127负数 1000 0000 1111 1111 ,即:-0-127反码反码:正数的反码与原码相同,负数的反码是该数的绝对值取反(含符号位) 。+4原码 0000 0100 反码:0000 0100-4原码:1000 0100 反码:1111 1011反码的范围是:正数:0000 0000 0111 1111+0 +127负数:1111 1111 1000 0000-0 -127原码和反码都存在两个缺点:存在 +0 和 0 ,不和谐。必须有减法运算,这就增加了计算机的复杂性。补码补码: 正数的补码和原码一样,即最高位(符号位)为0,其余为数值位。负数的补码为反
7、码加 1;+4,原码:0000 0100反码:0000 0100 补码:0000 0100-4,原码:1000 0100反码:1111 1011 补码:1111 1100补码表示的范围:正数:0000 0000 0111 1111即:0 127负数:1111 1111 1000 0000即: -1 -128引入补码后,减法运算可以由加法来代替,这就简化了计算机的结构。6如:205=20 +(- 5)计算机只能识别二进制数,那么计算机是如何识别十进制数字和其他的符号,图表的呢?在计算机中,是以二进制的组合来表示的,这就是二进制编码。计算机中根据信息对象的不同,编码方式也不一样,常见的有BCD 码
8、、ASC码。2.2.二二十进制编码(十进制编码(BCD 码)虽然十进制数可以转换成二进制数,但转换很慢,难以一下子看出,如:十进制数 789,用二进制表示为:1100010101。为了方便的用二进制来表示十进制数, 人们提出了既有二进制数特点又有十进制数特点的编码BCD 码。十个十进制数字可以用四位二进制数来表示, 选取四个有特点的二进制数,0001,0010,0100,1000,十进制中分别为:1,2,4, 8; 其他六个数字为这四个编码的组合, 因此又叫做 8421 BCD编码。下面是 8421 BCD 编码表:十进制数8421 BCD 数二进制数000000000100010001200
9、1000103001100117401000100501010101601100110701110111810001000910011001100001 00001010110001 00011011120001 00101100130001 00111101140001 01001110150001 01011111按照上述编码,十进制数 789 的 BCD 码为:0111 1000 1001,这样就比较方便。如: 1234.789 的 BCD 码为: 0001 0010 0011 0100 . 0111 1000 10013. ASC 码码 AmericanAmericanStandard
10、StandardCodeCodeforforInformationInformationInterchangeInterchange用七位二进制编码来表示十进制数字 0 9,英文字母 a z,AZ,还有一些控制字符,最高位用于奇偶校验。数字:0 930H 39H大写英文字母A Z41H 5AH小写英文字母a z61H 7AH8美国信息交换标准代码 ASC编码表(7 位代码)四、 计算机中二进制数的运算十进制,基本的运算为:加、减、乘、除。下面我们讨论二进制数的加、减、乘、除。1无符号二进制数的加法二进制数只有两个数字:0 和 1,其加法规则为: 0+0=09 0+1=1 1+1=0进位 1 1
11、+1+1=1 进位 1例 1:0000 1101Bmem1+ 0000 1101Bmem200011010Bmem3十进制数为:13+13=26若计算机字长为八位,结果不会有问题。下面看另外一个加法:例 2:1011 0101Bmem1+ 1000 1111Bmem21 0100 0100 Bmem3十进制数为:181+143=324结果为九位二进制数,产生了进位,由于 mem3 只有八位,因而第九位的 1 会丢失,在 men3 中实际上只有 01000100B即十进制数的 68,明显错误。为了处理这种问题,在 CPU 内部专门设置了一个寄存器,把运算结果的状态表示出来,以便程序进行处理。对
12、8051:是程序状态寄存器程序状态寄存器 PSWPSW 是一个 8 位特殊功能寄存器,它的各位包含了程序执行后的状态信息,供程序查询或判别之用。各位的含义及其格式如下:10D7D6D5D4D3D2D1D0CYACF0RS1RS0OVPCY(PSW7)进位标志位。在执行加法(或减法)运算指令时,如果运算结果最高位(位 7)向前有进位(或借位),CY 位由硬件自动置“1”;如运算结果最高位(位 7)无进位(或借位),则 CY 清“o” 。 CY也是 8051 在进行位操作(布尔操作)时的位累加器。AC(PSW6)半进位标志位,也称辅助进位标志。当执行加法(或减法)操作时,其运算结果(和或差)产生由
13、低半字节(位 3)向高半字节有半进位(或借位)时,AC 位将被硬件自动置“1” ,否则 AC 被自动清“o” 。OV(PSW2)溢出标志位。当进行补码运算时,如有溢出,即当运算结果超出128 十 127 的范围时,OV 位由硬件自动置 OV1;无溢出时,OV0。PSW1 为保留位,805l 末用,8052 为 Fl 用户标志位。P ( PSW0)奇偶检验标志位。每条指令执行完后,该位始终跟踪指示累加器 A 中 l 的个数。如结果 A 中有奇数个“l ”,则置 P1,否则 P0。常用于校验串行通讯中的数据传送是否出错。2无符号二进制数的减法基本规则:1-1=0 0-0=011 1-0=1 0-1
14、=1借位 1例 3:0001 1011B0000 1101B=借位:1 1被减数:0 0 0 1 1 0 1 1减数:0 0 0 0 1 1 0 1差:0 0 0 0 1 1 1 027-13 =14结果正确。例 4:0100 0100B10100101B =?借位 1 1 11被减数:0 0 0 1 1 0 1 1减数:1 0 1 0 0 1 0 1差:1 1 1 1 0 1 1 0运算中,产生了借位,硬件会自动地将进位标志置 1,以便程序员处理。3无符号二进制数的乘法乘法规则:00=0例 5: 1111B1101B=?01=01 1 1 110=01 1 0 111=11 1 1 11 1
15、 1 11 0 0 1 0 1 1121 1 1 11 1 0 0 0 0 1 14无符号二进制数的除法除法的规则是乘法和减法之和例 6:10011B101B=?0 0 0 1 1 11 0 11 0 0 0 1 11 0 10 0 1 1 11 0 11 0 11 0 105BCD 数的运算以 BCD 码表示的数,叫 BCD 数,BCD 数的运算遵守二进制运算规则。例 7:13+14=270 0 0 1 0 0 1 1BCD 130 0 0 1 0 1 0 0BCD 140 0 1 0 0 1 1 1BCD 27再看下列例子:例 8:26+35=61130 0 1 00 1 1 00 0 1
16、 10 1 0 10 1 0 11 0 1 11011 超过了 BCD 码的范围, 结果不正确,0 1 1 0超过 1001,要进行加 6 调整0 1 1 00 0 0 1十进制数为 61 结果正确当低四位大于 1001 即十进制数 9 时, 要进行 BCD 码调整即加 6;另外,当低四位有进位时,也要进行加 6 调整。例 9:29+38=670 0 1 01 0 0 1+0 0 1 11 0 0 00 1 1 00 0 0 1结果为 61,低四位产生了进位,此时 AF=10 1 1 0加 6 调整0 1 1 0 0 1 1 1结果为 67,正确同样, 在做减法时, 也有类似问题, 会出现半借
17、位或低四位大于 1001的情况,这样,需要进行减 6 调整。例 10:39-16=230 0 1 11 0 0 10 0 0 10 1 1 0140 0 1 00 0 1 1无借位,低四位也小于 1001,结果正确。例 11:36-19=170 0 1 10 1 1 00 0 0 11 0 0 10 0 0 11 1 0 1有半借位,AC=1,低四位大于 1001,需要进行减 6 调整0 1 1 0结果为:0 0 0 10 1 1 117 正确因此在做 BCD 码的加减法时,后面应进行十进制调整。6补码运算引入补码后,计算机只存在加法运算。例 12:2015=5即:20+(-15)补码:20=
18、 0 0 0 1 0 1 0 00 0 0 1 0 1 0 0原码:-15=1 0 0 0 1 1 1 11 1 1 1 0 0 0 1反码:-15=1 1 1 1 0 0 0 0结果为1 0 0 0 0 0 1 0 1补码:-15=1 1 1 1 0 0 0 1产生了进位,CY=1,丢失,正确例 13:-20+15=-5原码:-20=1 0 0 1 0 1 0 0反码:-20=1 1 1 0 1 0 1 1补码:-20=1 1 1 0 1 1 0 0补码:+15=0 0 0 0 1 1 1 1151 1 1 1 1 0 1 1真值为:-0 0 0 0 0 1 0 1 即-5,正确例 14:-
19、20-15= -351 1 1 0 1 1 0 0+1 1 1 1 0 0 0 1= 1 1 1 0 1 1 1 0 1结果为:0100011 即35虽然有进位,但是结果正确。当补码运算结果超过 128+127 时, 会产生溢出, 计算结果错误。例 15:120+105=2250 1 1 1 1 0 0 00 1 1 0 1 0 0 11 1 1 0 0 0 0 1补码结果为:0011111 即31,错误两个正数相加(补码) ,结果超过了 127,产生了溢出,硬件将自动置位 OV=1例 16:120105=2251 0 0 0 1 0 0 01 0 0 1 0 1 1 11 0 0 0 1 1 1 1 1结果为 +31,错误原因是结果超过了 128,产生了溢出。结论:补码运算时,应考虑溢出,无符号数运算时,应考虑进位,BCD 码运算时,应考虑半进位。16重点:运算后,PSW 的状态。