首页 理论教育 补码运算及溢出错误分析

补码运算及溢出错误分析

时间:2023-11-16 理论教育 版权反馈
【摘要】:在算数运算过程中,连同符号位一起参加运算,称为补码运算,其运算结果仍为补码。16位的原码、反码和补码表示的范围分别是:①原码:32767~+32767。当16位带符号数的运算结果超出以上范围时,就会产生溢出。在微机中所有带符号的数都是用补码表示的。例1-6 已知X=01000000,Y=01000001,进行补码的加法运算。两负数相加,其结果应为负数,应为129,但运算结果为正数,这显然是错误的,其原因是和数129<128,超出了8位补码所能表示的最小值,产生了溢出错误。

补码运算及溢出错误分析

在计算机中,带有符号位的数都是用补码表示。在算数运算过程中,连同符号位一起参加运算,称为补码运算,其运算结果仍为补码。

1.补码加法

补码加法的规则是:和的补码等于补码之和。设X+Y=Z,则[X]+[Y]=[X+Y]=[Z],其中,XY为正、负数均可。

例1-3 已知:[+51]=00110011B,[+66]=01000010B

[−51]=11001101B,[−66]=10111110B

求:[+66]+[+51]=?[+66]+[−51]=?[−66]+[−51]=?

解:(1)[+66]+[+51]=?

由于[+66]+[+51]=[(+66)+(+51)]=01110101B结果为正,因此,[(+66)+(+51)]=[(+66)+(+51)]=01110101B其真值为+117,计算结果正确。

(2)[+66]+[−51]=?

由于[+66]+[−51]=[(+66)+(−51)]=00001111B的符号位为0,结果为正,因此,[(+66)+(−51)]=[(+66)+(−51)]=00001111B,其真值为+15,计算结果正确。

(3)[−66]+[−51]=?

由于[−66]+[−51]=10001011B=[(−66)+(−51)]结果为负,因此,[(−66)+(−51)]原=[[(−66)+(−51)]]=11110101B,其真值为−117,计算结果正确。

可以看出,不论被加数、加数是正数还是负数,只要直接用它们的补码直接相加,当结果不超出补码所表示的范围时,计算结果便是正确的补码形式。但当计算结果超出补码表示的范围时,结果就不正确了,这种情况称为溢出。

2.补码减法

补码减法的规则是:差的补码等于第一个数的补码和第二个数符号变性之后(原正数变为负数,原负数变为正数)的补码相加。设X−Y=Z,也可写成X+(−Y)=Z

则[X]+[−Y]=[XY]=[Z]

Y≥0时:Y应变为负数,求其补码,再与[X]相加;

Y<0时:Y应变为正数,求其补码,再与[X]相加。

例1-4 已知:[+51]=00110011B,[+66]=01000010B,[−51]=11001101B,[−66]=1011 1110B

求:[+66]−[+51]=?[−66]−[−51]=?

解:(1)[+66]−[+51]=[+66]+[−51]=?

(2)[−66]−[−51]==[−66]+[+51]=?

可以看出,无论被减数、减数是正数还是负数,上述补码减法的规则都是正确的。同样,由最高位向更高位的进位会自动丢失而不影响运算结果的正确性。计算机中带符号数用补码表示时有如下优点:

①可以将减法运算变为加法运算,因此可使用同一个运算器实现加法和减法运算,简化了电路。

②无符号数和有符号数的加法运算可以用同一个加法器实现,结果都是正确的。

例1-5 无符号数225=11100001;13=[13]=00001101;[−31]=11100001

求:225+13=?;[−31]+[13]=?

解:(www.xing528.com)

若两操作数为无符号数时,计算结果为无符号数11101110B,其真值为238,结果正确;若两操作数为补码形式,计算结果也为补码形式,11101110B为­18的补码,结果也是正确的。

3.溢出及其判断方法

(1)溢出

如前所述,带符号数的表示都有一定的范围,对于8位的原码、反码和补码,表示的范围分别是:

①原码:−127~+127(FFH~7FH)。

②反码:−127~+127(80H~7FH)。

③补码:−128~+127(80H~7FH)。

当8位带符号数的运算结果超出以上范围时,就会产生溢出。

16位的原码、反码和补码表示的范围分别是:

①原码:−32767~+32767(FFFFH~7FFFH)。

②反码:−32767~+32767(8000H~7FFFH)。

③补码:−32768~+32767(8000H~7FFFH)。

当16位带符号数的运算结果超出以上范围时,就会产生溢出。

微机中所有带符号的数都是用补码表示的。所谓溢出,是指带符号数的补码加减运算的结果超出了补码表示的范围:例如,字长为n位的带符号数,用最高位表示符号,其余n-1位用来表示数值,它所表示的补码运算的范围为(−2n−1)~(+2n−1−1)。如果运算结果超出此范围,就叫补码溢出,简称溢出。若发生溢出,则带符号数的运算结果必然是错误的。

例如:字长为8位的二进制数用补码表示时,其范围为(−28−1)~(+28−1−1),即−128~+127,若运算结果超出此范围,就会产生溢出。

例1-6 已知X=01000000,Y=01000001,进行补码的加法运算。

解:[X]=01000000B=+64D;[Y]=01000001B=+65D;[Z]=[X]+[Y]=10000001;Z=-127D

两个正数相加,其结果应为正数,应为+129,但运算结果为负数(−127D),这显然是错误的,其原因是和数+129>+127,超出了8位补码所能表示的最大值,使数值部分占据了符号位的位置,产生了溢出错误。

例1-7 已知X=−1111111,Y=−0000010,进行补码的加法运算。

两负数相加,其结果应为负数,应为−129,但运算结果为正数(+127),这显然是错误的,其原因是和数−129<−128,超出了8位补码所能表示的最小值,产生了溢出错误。

(2)溢出的判断方法

溢出只能出现在两个同符号数相加或两个异符号数相减的情况下。判断有符号数的运算有无溢出的方法有许多种,如根据参加运算的两个数的符号及运算结果的符号可以判断有无溢出。利用双进位方法判断有无溢出是一种常用的方法,它的规则是,在两个同符号数相加或异符号数相减时:

①如果次高位向最高位有进位(或借位),而最高位向前无进位(或借位),则结果发生溢出。

②反过来,如果次高位向最高位无进位(或借位),而最高位向前有进位(或借位),则结果也发生溢出。

总而言之,最高位与次高位不同时进位则表明发生溢出。

在计算机中,可用多字节表示更大的数,避免产生溢出错误。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈