80x86标志位相关

来源:互联网 发布:剑三 点绛唇捏脸数据 编辑:程序博客网 时间:2024/06/05 05:39

溢出与进位

1. 关于进位与溢出的本质说明,需重点理解

          两者的区别在计算机中,溢出代表计算结果是错误的,而进位不代表计算结果错误。进位是针对无符号数而言的,溢出是针对有符号数而言的。

 


 

2.进位与溢出的判断

         a.从人的计算角度来看进位与溢出


             无符号数的进位

                       一个字节(8位) 的数有256个 (2的8次方)
                       一个字(16位) 的数有65536个 (2的16次方)
                      8个二进制位能够表达的无符号数范围是:0 ~ 255
                     16
位表达的无符号数范围是:0 ~ 65535
                      对于无符号数来说,不存在溢出的问题,只存在进位的问题。例如129+129=258,超出一个字节的表示范围,最高位就会产生进位。


                  有符号数的溢出

                     8个二进制位能够表达的有符号数范围是:+127 ~ -128

                    16位表达的有符号数范围是:+32767 ~ -32768

                     如果运算结果超出了这个范围,就是产生了溢出。

                     溢出是指结束超出数据所表示的范围,通俗地说是装不下了。例如,两个带符号的字节数127和2相加,结果为129,因为带符号的字节数最大正数为127,所以超

                     范围,溢出  标志位OF为1,说明出错了。

             从人的角度根据操作数的符号类型,可以判断两个数的运算结果是否会发生溢出或进位。

    


           b.从编写程序的角度如何来看进位与溢出呢?

             首先要明确计算机对于加减法的运算计算机存储有符号数与无符号数据时,以补码的形式存储。对于 减法运算,先将减数化为负数,再以

                 补码形式存放到寄存器中,用加法电路完成被减数与减数补码的加法运算。即以同一套电路完成加减法运算。由于计算机的加法电路不区分有符号  数与无符号数,即无符号加法运算与有符号加法运算使用同一套电路产生运算结果。那么如何区分是产生了进位还是产生了借位呢?这就需要程序员的判断了当编写汇编程序时,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。一般来说进位很容易判断,即使产生了进位结果也是正确的,直接带进位参与后续计算即可。而溢出呢,同号相加就要注意溢出了。


3.  进位与溢出的产生

       那么计算机究竟是怎样产生进位与溢出的呢?

        注意:以下内容为计算机组成原理的知识,编程人员只需掌握上述内容即可,下述知识对编程无影响,为计算机硬件自动进行的,无兴趣者,可忽略跳过。

        对于溢出的判断

        ① 通过参加运算的两个数的符号及运算结果的符号进行判断。② 单符号位法。该方法通过符号位和数值部分最高位的进位状态来判断结果是否溢出。③双符 号位法,又称为变形补码法。它是通过运算结果的两个符号位的状态来判断结果是否溢出。

       上述三种方法中,第一种方法仅适用于手工运算时对结果是否溢出的判断,其他两种方法在计算机中都有使用。在此仅通过具体例子对第②种方法做简要介绍。

       若符号位进位状态用CF来表示,当符号位向前有进位时,CF=1,否则,CF=0;数值部分最高位的进位状态用DF来表示,当该位向前有进位时,DF=1,否则,DF=0。单符号位法就是通过该两位进位状态的异或结果来判断是否溢出的。

                    OF=CF^DF

        OF=1,说明结果溢出;若OF=0,则结果未溢出。也就是说,当符号位和数值部分最高位同时有进位或同时没有进位时,结果没有溢出,否则,结果溢出。

       对于进位的判断

     加法电路自动向前进位,CY位为1,说明有进位;为0,说明无进位。

   

1 0
原创粉丝点击