第2章计算机中的数制和编码2.2.4补码的加减运算1.补码加法在计算机中,凡是带符号数一律用补码表示,运算结果自然也是补码。其运算特点是:符号位和数值位一起参加运算,并且自动获得结果(包括符号位与数值位)。补码加法的运算规则为:即:两数补码的和等于两数和的补码。补补补][][][yxyx(2.2.5)第2章计算机中的数制和编码例2.11已知[+51]补=00110011B,[+66]补=01000010B,[-51]补=11001101B,[-66]补=10111110B求[+66]补+[+51]补=?[+66]补+[-51]补=?[-66]补+[-51]补=?解:二进制(补码)加法十进制加法01000010[+66]补+66+)00110011[+51]补+)+5101110101[+117]补+117第2章计算机中的数制和编码二进制(补码)加法十进制加法01000010[+66]补+66+)11001101[-51]补+)-5100001111[+15]补+151自动丢失由于[+66]补+[+51]补=[(+66)+(+55)]补=01110101B结果为正,因此[(+66)+(+55)]原=[(+66)+(+55)]补=01110101B其真值为+117,计算结果正确。第2章计算机中的数制和编码二进制(补码)加法十进制加法10111110[-66]补-66+)11001101[-51]补+)-5110001011[-117]补-1171自动丢失由于[+66]补+[−51]补=[(+66)+(−55)]补=00001111结果为正,因此[(+66)+(−55)]原=[(+66)+(−55)]补=00001111其真值为+15,计算结果正确。结论:两数的和为正,正数的补码等于原码。第2章计算机中的数制和编码由于[-66]补+[-51]补=10001011B=[(-66)+(-55)]补结果为负,因此[(-66)+(-55)]原=[[(-66)+(-55)]补]补=11110101B其真值为-117,计算结果正确。结论:两数的和为负,将负数的补码还原为原码。可以看出,不论被加数、加数是正数还是负数,只要直接用它们的补码直接相加,当结果不超出补码所表示的范围时,计算结果便是正确的补码形式。但当计算结果超出补码表示范围时,结果就不正确了,这种情况称为溢出。第2章计算机中的数制和编码2.补码减法补码减法的运算规则为:补补补补补][][][][][yxyxyx(2.2.6)第2章计算机中的数制和编码例2.12已知[+51]补=00110011B,[+66]补=01000010B[−51]补=11001101B,[−66]补=10111110B求[+66]补−[+51]补=?[-66]补--[-51]补=?解[+66]补-[+51]补=[+66]补+[-51]补[-66]补-[-51]补=[-66]补+[+51]补第2章计算机中的数制和编码二进制(补码)加法十进制加法10111110[-66]补-66+)00110011[+51]补-)-5111110001[-15]补-15二进制(补码)加法十进制加法01000010[+66]补+66+)11001101[-51]补-)+5100001111[+15]补+151自动丢失结论:两数的和为正,正数的补码等于原码。结论:两数的和为负,将负数的补码还原为原码。第2章计算机中的数制和编码可以看出,无论被减数、减数是正数还是负数,上述补码减法的规则都是正确的。同样,由最高位向更高位的进位会自动丢失而不影响运算结果的正确性。计算机中带符号数用补码表示时有如下优点:①可以将减法运算变为加法运算,因此可使用同一个运算器实现加法和减法运算,简化了电路。第2章计算机中的数制和编码②无符号数和带符号数的加法运算可以用同一个加法器实现,结果都是正确的。例如:无符号数带符号数11100001225[-31]补+)00001101+)13+)[+13]补11101110238[-18]补若两操作数为无符号数时,计算结果为无符号数11101110B,其真值为238,结果正确;若两操作数为补码形式,计算结果也为补码形式,11101110B为–18的补码,结果也是正确的。第2章计算机中的数制和编码2.2.5溢出及其判断方法1.进位与溢出所谓进位,是指运算结果的最高位向更高位的进位,用来判断无符号数运算结果是否超出了计算机所能表示的最大无符号数的范围。溢出是指带符号数的补码运算溢出,用来判断带符号数补码运算结果是否超出了补码所能表示的范围。例如,字长为n位的带符号数,它能表示的补码范围为-2n-1+2n-1-1,如果运算结果超出此范围,就叫补码溢出,简称溢出。第2章计算机中的数制和编码2.2.5溢出及其判断方法例1X=+1000000Y=+1000001,求两数的补码之和?解:[X]补=01000000[Y]补=01000001结论:两个整数相加,结果应该为+129,结果确为负数-127,发生错误的原因是运算中产生了溢出。[X]补=01000000[Y]补=01000001+)[X]补+[X]补=10000001+64+)+56+129第2章计算机中的数制和编码2.溢出的判断方法判断溢出的方法很多,常见的有:①通过参加运算的两个数的符号及运算结果的符号进行判断。②单符号位法。该方法通过符号位和数值部分最高位的进位状态来判断结果是否溢出。③双符号位法,又称为变形补码法。它是通过运算结果的两个符号位的状态来判断结果是否溢出。上述三种方法中,第一种方法仅适用于手工运算时对结果是否溢出的判断,其他两种方法在计算机中都有使用。限于篇幅,本节仅通过具体例子对第②种方法做简要介绍。第2章计算机中的数制和编码若符号位进位状态用CF来表示,当符号位向前有进位时,CF=1,否则,CF=0;数值部分最高位的进位状态用DF来表示,当该位向前有进位时,DF=1,否则,DF=0。单符号位法就是通过该两位进位状态的异或结果来判断是否溢出的。(2.2.7)若OF=1,说明结果溢出;若OF=0,则结果未溢出。也就是说,当符号位和数值部分最高位同时有进位或同时没有进位时,结果没有溢出,否则,结果溢出。DFCFOF第2章计算机中的数制和编码例2.13设有两个操作数x=01000100B,y=01001000B,将这两个操作数送运算器做加法运算,试问:①若为无符号数,计算结果是否正确?②若为带符号补码数,计算结果是否溢出?解无符号数带符号数0100010068[+68]补+)01001000+)72+)[+72]补10001100140[+140]补DF=1CF=0第2章计算机中的数制和编码①若为无符号数,由于CF=0,说明结果未超出8位无符号数所能表达的数值范围(0255),计算结果10001100B为无符号数,其真值为140,计算结果正确。②若为带符号数补码,由于=1,结果溢出;这里也可通过参加运算的两个数的符号及运算结果的符号进行判断,由于两操作数均为正数,而结果却为负数,因而结果溢出;+68和+72两数补码之和应为+140的补码,而8位带符号数补码所能表达的数值范围为−128+127,结果超出该范围,因此结果是错误的。第2章计算机中的数制和编码例2.14设有两个操作数x=11101110B,y=11001000B,将这两个操作数送运算器做加法运算,试问:①若为无符号数,计算结果是否正确?②若为带符号补码数,计算结果是否溢出?解无符号数带符号数11101110238[-18]补+)11001000+200+)[-56]补10110110438[-74]补DF=1CF=11自动丢失第2章计算机中的数制和编码①若为无符号数,由于CF=1,说明结果超出8位无符号数所能表达的数值范围(0255)。两操作数11101110B和11001000B对应的无符号数分别为238和200,两数之和应为438255,因此,计算结果是错误的。②若为带符号数补码,由于=0,结果未溢出。两操作数11101110B和11001000B分别为−18和−56的补码,其结果应为−74的补码形式,而计算结果10110110B正是−74的补码,因此结果正确。第2章计算机中的数制和编码2.3信息的编码2.3.1二进制编码的十进制数(BCD编码)虽然二进制数对计算机来说是最佳的数制,但是人们却不习惯使用它。为了解决这一矛盾,人们提出了一个比较适合于十进制系统的二进制编码的特殊形式,即将1位十进制的09这10个数字分别用4位二进制码的组合来表示,在此基础上可按位对任意十进制数进行编码。这就是二进制编码的十进制数,简称BCD码(Binary-CodedDecimal)。第2章计算机中的数制和编码4位二进制数码有16种组合(00001111),原则上可任选其中的10个来分别代表十进制中09这10个数字。但为了便于记忆,最常用的是8421BCD码,这种编码从00001111这16种组合中选择前10个即00001001来分别代表十进制数码09,8、4、2、1分别是这种编码从高位到低位每位的权值。BCD码有两种形式,即压缩型BCD码和非压缩型BCD码。第2章计算机中的数制和编码1.压缩型BCD码压缩型BCD码用一个字节表示两位十进制数。例如,10000110B表示十进制数86。2.非压缩型BCD码非压缩型BCD码用一个字节表示一位十进制数。高4位总是0000,低4位用00001001中的一种组合来表示09中的某一个十进制数。第2章计算机中的数制和编码表2.28421BCD码部分编码表十进制数压缩型BCD码非压缩型BCD码123910111920210000000100000010000000110000100100010000000100010001100100100000001000010000000100000010000000110000100100000001000000000000000100000001000000010000100100000010000000000000001000000001第2章计算机中的数制和编码需要说明的是,虽然BCD码可以简化人机联系,但它比纯二进制编码效率低,对同一个给定的十进制数,用BCD码表示时需要的位数比用纯二进制码多,而且用BCD码进行运算所花的时间也要更多,计算过程更复杂,因为BCD码是将每个十进制数用一组4位二进制数来表示,若将这种BCD码送计算机进行运算,由于计算机总是将数当作二进制数来运算,所以结果可能出错,因此需要对计算结果进行必要的修正,才能使结果为正确的BCD码形式。第2章计算机中的数制和编码例2.15十进制数与BCD数相互转换。①将十进制数69.81转换为压缩型BCD数:69.81=(01101001.10000001)BCD②将BCD数10001001.01101001转换为十进制数:(10001001.01101001)BCD=89.69第2章计算机中的数制和编码例2.16设有变量x等于10010110B,当该变量分别为无符号数、原码、补码、压缩型BCD码时,试分别计算变量x所代表的数值大小。解无符号数:x=10010110B=127+026+025+124+023+122+121+020=150原码:[x]原=10010110Bx=-026+025+124+023+122+121+020=-22补码:[x]补=10010110B[x]原=[[x]补]补=11101010Bx=-126+125+024+123+022+121+020=-106BCD码:[x]BCD=10010110Bx=96第2章计算机中的数制和编码例2.17(BCD码运算时的修正问题)用BCD码求38+49。解0011100038的BCD码+)0100100149的BCD码1000000181的BCD码计算结果10000001是81的BCD数,而