作者在 2009-06-19 17:16:47 发布以下内容
微机原理,这个溢出不溢出,是怎么看的呢? 说什么同号,相反,就溢出 0+0=1 1+1=0就是溢出,还是不明白 ABH是负数,为什么?
这个图片里的运算例子,都是以X86基本汇编里的补码运算为基础的.在这里有几个前提,你应该注意:一是约定,整个编码串以二进制为基础,其他进制的在运算是应转换为二进制;二是二进制编码串的最左边一位(一般是8的倍数),约定是数的符号位,用0表示是正数,1表示是负数,X86CPU里由SF来记录这个状态.三是一般约定是纯整数形式的.最后,应该注意补码运算的特性,符号位当作数值位一样直接加减运算. 对于溢出,意思就是运算结果超过了计算机的表示能力,毕竟计算机中能表达的二进制位数是有限制的.它的判别,有个简单的口诀,可以借鉴:异号相加或者同号相减不会溢出.同号相加或者异号相减时,如果结果的符号位(就是最左边一位)和被加数的符号位相反(加法时)或者与被减数的符号相反(减法时),那就是溢出.X86CPU里由OF来记录这个状态. 对于进位,在补码运算里的理解就是,最左边的二进制位向更高位的进位,从现在看,就是符号位向更高位的进位.原因已经解释了:补码里符号位是当数字一样算的. 现在就具体分析你所说的第二个例子里的运算过程.ABH展开成二进制,就是1010 1011B,这里的最左边的1,就是符号位,现在是1,说明这个数是负的H和B都是进制后缀,分别表示16进制和二进制;FFH展开成二进制,就是1111 1111H,最左边也是1,也说明这个数是负的.现在是同号(都是小于0的)相加.从低位依次完成,同时处理各位的进位信息,结果是1 1010 1010B,这里的最左边多出来的那位的1,就是符号位运算后向更高位的进位,由CF来记录,数字表达里不写.有效的8位数据里,观察最左边1位,也是1,说明运算后符号没变,那就是没有溢出. 上面是直接用口诀来观察的,另外有一种运算常用的简易判别方法:双符号位溢出检测法,我在这里写出来,供你参考.双符号位法,就是把最左边的符号位再写一次,形成两个符号位,参与运算.运算结果的两个符号位比较,如果一样,就没有溢出,不一样,就有溢出了.结果的符号位取右边靠近剩余数字串的符号位.还是以这两个数做例子: 11 010 1011 最左边是写了两次的符号位,和数字串分离开了以示区别 + 11 111 1111 -------------- 1 11 010 1010 结果中,最左边的1是进位位,CF;再左边的两个1,就是结果的双符号位,现在是一样的,说明没有溢出,结果的符号取这两个符号位中右边的,靠近010的那个1,表示是负的. 对于双符号位中的两个符号,可以这样理解:左边的表示是理论上应该出现的符号结果,右边的表示是现在计算机算出来的实际符号结果.一致,就没问题,没溢出;不一致,就是有溢出了. 双符号位法在实际运算中运用较多,熟练后就可以直接用口诀来判定.你可以验证下,其他的那个例子,也是遵循这个规律的.