进位与溢出

进位与溢出

       Cy位是进位位,用来表示本次无符号数运算结果的溢出溢出。由于无符号数的最高有效位只有数位意义而无符号意义,所以该位所产生的进位应该是本次运算结果的实际进位值。所以说:进位位Cy是在给定二进制数的位数范围内,代表了本次运算结果的溢出情况。另一方面,它所保存的进位值有时也是有用的。例如,双字长运算时,可以利用进位值把低位字的进位计入高位字。

       OV位表示溢出。溢出位是用来表示带符号数的运算结果超出有限字长的表示范围的标志。它是根据两个操作数的符号及其变化来设置的。如两个操作数符号相同而运算结果的符号与之相反时OV=1,反之,OV=0。

       例题1:无符号数和带符号数均不溢出

 

按无符号数对待

按带符号数对待

0000 0100

4

(+) 4

+     0000 1011

     +  11

    +   (+)11

0000 1111

15

(+)15

       例题2:无符号数溢出的情况

 

按无符号数对待

按带符号数对待

0000 0111

7

(+)7

+  1111 1011

     +  251

    +   (-)5

1Cy 0000 0010

258

(+)2

 

Cy = 1

OV =0

       注:在字长为8位的情况下,258表示的也是2,所以结果均为2。

       例题3:带符号数溢出的情况

 

按无符号数对待

按带符号数对待

0000 1001

9

(+)9

+  0111 1100

     +  124

    +   (+)124

  1000 0101

133

(+)133

 

Cy =0

OV = 1

       例题3:带符号数和无符号数均溢出的情况

 

按无符号数对待

按带符号数对待

1000 0111

135

(-)121

+  1111 0101

     +  245

    +   (-)11

  1Cy 0111 1100

380

(-)132


Cy =1

OV = 1

       结论:两个同符号数相加,才可能产生溢出。两个符号相异的数相加不可能产生溢出。计算机对进位位的判断规则为:两个带符号数进行补码加减运算时,通常用符号位产生的进位(S代表)与最高有效数值位向符号位产生的进位(Cy代表)进行异或操作,若异或结果为1则发生溢出,反之则无溢出发生。OV = S + Cy 。以8位二进制为例,OV = Cy7 + Cy6

       例题4:十六位数举例。

0100 0110 0101 0010

4652

+  1111 0000 1111 0000

 +   F0F0

  1Cy 0011 0111 0100 0010

 

3742

 

Cy =1   OV = 0

1111 0011 0110 0101

F365

+  1110 0000 0010 0100

 +   E024

  1Cy 1101 0011 1000 1001

 

3742

 

Cy =0   OV = 0

       例题5  8位数举例。

0111 1000

120

+  0110 0100

  +  100

   1101 1100

 

220

1000 1000

136

+  1001 1100

 +   156

  1Cy 0010 0100

 

292(36)

总结:无符号数  Cy =0 OV = 0

         带符号数  Cy7 =0  Cy6 = 1  OV = 1

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

所谓符号扩展问题是指一个数从位数较少扩展到位数较多(如从8位扩展到16位,或从16位扩展到32位)时应该注意的问题。

 

有符号数是用最高位是0或1来标记正负的,如果最高位是0(如8位数中的第7位,从0位开始算的)表示正数,而是1表示负数。16位数中的第15位控制符号。符号数扩展实称为带符号扩展。只是位数的扩展,不能改变原值的!

如0000 1101这个数是带符号数为13,扩展为16位时,一个16位数也要是13的!而这个数是0000 0000 0000 1101就可以了!所以正数的带符号扩展前边是加0,这只是一个规律而不是本质,本质就是数大小不改变!

而10001101带符号数不是-13的!而是将其取补加1就是负数结果,即-0111 0010 + 1,结果就是-115,如果将这个带符号数扩展时,只有16位1111 1111 1000 1101才是-115,扩展只是表示范围大了,而不是改变数值的。如果是正数前8位是0,如果是负数,前8位是1,这样才是带符号扩展的。这不是本质,只是一个规律而已!

在汇编语言中,我们经常要对字/字节的数据进行操作。当把“字节”转换成“字”,或“字”转换成“双字”时,就需要进行符号扩展。符号扩展的具体操作就是把已知信息的最高位扩展到所有更高位。

例1.1 把8位补码0101 1010、10101100分别扩展成16位补码。
解:根据符号扩展的含义,“字节→字”的具体扩展结果如下:

 

0101 1010

 

1010 1100

0000 0000

0101 1010

1111 1111

1010 1100

例1.2 把16位补码0101101111001010、1010111101011011别扩展成32位补码。
解:根据符号扩展的含义,“字→双字”的具体扩展结果如下:

 

0101 1011 1100 1010

 

1010 1111 0101 1011

0000 0000 0000 0000

0101 1011 1100 1010

1111 1111 1111 1111

1010 1111 0101 1011

 

 

对于用补码表示的数,正数的符号扩展应该在前面补0,而负数的符号扩展则应该在前面补1。例如,机器字长为8位时,[+46]补=00101110,[-46]补=1101 0010;如果把它们从8位扩展到16位,则[+46]补=00000000 0010 1110=002EH,[-46]补=11111111 1101 0010=FFD2H

 

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值