新浪博客

溢出判断

2006-03-03 22:35阅读:
溢出判断   补码定点加减运算判断溢出有三种方法。
  (1)用一位符号位判断溢出。对于加法,只有在正数加正数和负数加负数两种情况下才可能出现溢出,符号不同的两个数相加是不会出现溢出的。对于减法,只有在正数减负数或负数减正数两种情况下才可能出现溢出,符号相同的两个数相减是不会出现溢出的。因此在判断溢出时可以根据参加运算的两个数据和结果的符号位进行;两个符号位相同的补码相加,如果和的符号位与加数的符号相反,则表明运算结果溢出;两个符号位相反的补码相减,如果差的符号位与被减数的符号位相反,则表明运算结果溢出。这种方法需要判断操作是加法还是减法,以及运算结果与操作数的符号关系。
  符号不同的两个数相加不会产生溢出的原因是字长为n+1位时,数值部分为n位,数值部分的最大绝对值为2n。如果参加运算的两个数x和y的绝对值都小于2n,则(+x)+(-y)和(-x)+(+y)的绝对值都不会大于2n,因此只需考虑(+x)+(+y)和(-x)+(-y)的情况,这时结果z的符号应与x和y的符号相同,即当x0=1且y0=1时,z0=0说明数据溢出;或者当x0=0且y0=0时,z0=1说明数据溢出。这样可列出下表所示的判断逻辑的真值表。
x0 y0 z0
V
0 0 0
0
0 0 1
1
0 1 0
0
0 1 1
0
1 0 0
0
1 0 1
0
1 1 0
1
1 1 1
0
  根据真值表,可得判断溢出的逻辑表达式:
  
  这种溢出判断方法不仅需要判断加法运算的结果,而且需要保持原操作数。
  (2)利用数据编码的最高位(符号位)和次高位(数值部分的最高位)的进位状况来判断运算结果是否发生了溢出。

  两个补码数实现加减运算时,若最高数值位向符号位的进位值与符号位产生的进位输出值不相同,则表明加减运算产生了溢出。因为当x和y均为n+1位正整数时,其和有两种情况:当x+y<2n时,不会发生溢出;当x+y≥2n时符号位没有进位,表明发生溢出。当x和y都是n+1位负数时,其和也有两种情况:当x+y≥-2n时,不会发生溢出;当x+y<-2n时,符号位相加后变成0并且有进位,而数值部分的最高位相加时无进位,结果变为正数,表明发生了溢出。减法的情况与此类似,这种判断方法的逻辑表达式如下:
  例:设x=+1011, y=+1001,求[x+y]
  解:[x]=01011, [y]=01001
   [x+y]=01011+01001=10100
  两个正数相加,最高两位的进位为01,表示发生了溢出,其结果为负数,显然是错误的。
  例:设x=-1101,y=-1011,求[x+y]
  解:[x]=10011, [y]=10101
    [x+y]=10011+10101=01000
  两个负数相加,最高两位的进位为10,表示发生了溢出,其结果为正数,显然是错误的。
  (3)采用双符号位补码进行判断。正常时两个符号位的值相同,在运算结果中当两个符号位不同时则表明发生了溢出。运算结果的符号位为01表明两个正数相加,结果大于机器所能表示的最大正数,称为上溢;运算结果的符号位为10表明两个负数相加,结果小于机器所能表示的最小负数,称为下溢。也就是说,两个正数相加,数值位不应向符号位同时产生进位,使得结果数的符号位和操作数的一样,为00:
    00+00+00(进位)=00 (mod 4)
  两个负数相加,数值位应向符号位产生进位,使得两个负数的双符号位的运算为11;
   11+11+01(进位)=11 (mod 4)
  当运算结果的两个符号位不相同时,表明出现了溢出。判断溢出的逻辑表达式:
  
  其中Z′为增加的符号位。
  例:设x=+1100,y=+1000,求6位双符号位补码之和[x+y]
  解:[x]=001100, [y]=001000
    [x+y]=001100+001000=010100
    [x+y]=010100,其中两个符号位出现01,表示已溢出。
  例:设x=-1100,y=-1000,求6位双符号位补码之和[x+y]
  解:[x]=110100, [y]=111000
    [x+y]=110100+111000=101100
    [x+y]=101100,其中两个符号位出现10,表示已溢出。
  从上述例子中还看出,不论溢出与否,最高位始终指示正确的符号。采用双符号位补码后,任何小于1的正数,两个符号位都是0;任何大于-1的负数,两个符号位都是1。如果两个数相加后,其结果的符号位出现01或10时,表示发生溢出。因为两个绝对值小于1的数相加,其结果不会大于或等于2,所以最高位总是表示正确的符号。这也可以表示为:当最高数据位有进位而符号位无进位时产生上溢出;当最高数据位无进位而符号位有进位时,表示下溢出。
  在双符号位补码中,正常的数据中两个符号位总是相同的,所以在存储数据时不必重复存储,只是在将数据送往运算部件进行运算时才把符号位进行复制形成双符号位补码

我的更多文章

下载客户端阅读体验更佳

APP专享