zoukankan      html  css  js  c++  java
  • 进位与溢出

     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  Cy= 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

  • 相关阅读:
    如释重负(纪——写完作业论文)
    安装sql2005中文版时提示系统配置检查器失败,消息为“性能监视器计数器检查失败”
    Get ConnectString Form Web.config
    如何在ASP.NET中实现防盗链[转]
    Authentication and Authorization
    上传大步的自唱Music,绝对好听!
    "某个程序安装已在安装计算机上创建挂起的文件操作" 解决办法
    WebM给我们带来什么?H.264又给我们带来什么?Google不支持H.264对未来会产生怎样的影响? 人工智能
    机器学习初探 人工智能
    函数式编程学习之路(九) 人工智能
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9331278.html
Copyright © 2011-2022 走看看