微机原理,这个溢出不溢出,是怎么看的呢

http://hiphotos.baidu.com/wo%D2%AA%B7%C9/pic/item/38364cc246a0d23fe4dd3b57.jpg
微机原理,这个溢出不溢出,是怎么看的呢? 说什么同号,相反,就溢出 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,表示是负的.
对于双符号位中的两个符号,可以这样理解:左边的表示是理论上应该出现的符号结果,右边的表示是现在计算机算出来的实际符号结果.一致,就没问题,没溢出;不一致,就是有溢出了.
双符号位法在实际运算中运用较多,熟练后就可以直接用口诀来判定.你可以验证下,其他的那个例子,也是遵循这个规律的.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-09-12
在汇编里要把所有数转换成2进制看,最高位为1时是负数,最高位是0时是正数.两个最高为相同的数叫同符号数.当两个最高位为0的数相加的结果值最高位是1或者当两个最高位为1的数相加的结果值最高位是0的时候就说这个数溢出了.
ABH转换为二进制的时候为10101011B,最高位是1,所以是负数.
第2个回答  2007-09-12
of的设置,以加法为例,如果两数符号相同,结果却相反,

则of=1;否则of=0;(如果两数符号相反,是不会溢出的)。

cf的设置,最高有效位(bit7,比如)向高位进位则为1,

否则为0。所以实际上of是表示有符号数的溢出,cf是表示

无符号数的溢出。理解进位,从af位的设置更为容易。

ABH转换为二进制的时候为10101011B,符号位是1,所以是负数
第3个回答  2022-09-25

补码的运算结果,超出预定的范围(如-128~+127),就是溢出。

CPU 可不管你的数据,是不是补码!

CPU 也不管你是不是溢出!

CPU 的任务,只是把:

 “次高位向最高位的进位、最高位再出现的进位”相异或,再送到 OF。

相似回答