leiqianghua 发表于 2013-7-7 20:29:50

关于溢出的问题想请教一下

两个有符号数做运算,如果发生溢出的话OF位肯定是等于1吧??那比如我11111111+11111111结果是111111110,这会产生溢出,11111111这个是负数,两个负数相加肯定是负数,那得到的结果111111110前面第9位是溢出去了,CPU里的结果是11111110,有溢出但CPU结果是负数。。。那这要怎么确定逻辑结果到底是正还是负呢????溢出位有时候是1有时候是0我要怎么确认这溢出位到底是1还是0????

monk-half 发表于 2013-7-8 13:27:40

楼主可能是被符号位给搞混乱了,这个我曾经也纠结了很久。
首先,楼主有没有没有注意到:计算机在进行负数运算,或者说减法运算的时候,先把它变成含符号位的加法运算,但是接下来得到的结果还需要进行再一次的补码才是正确的答案。比如你的111 111 110 楼主需要将它换成补码(100 000 010 => -2),才去考虑是否溢出。
其实楼主在实际运用中倒是不用考虑补码啊什么的。直接-1-1=-2结果是负数, 所以SF为1 。不就行了。

az4121 发表于 2013-7-8 15:51:10

7位 6位 5位 4位 3位 2位 1位 0位
1    1    1    1    1    1    1    1
1    1    1    1    1    1    1    1
有符号运算结果是11111110,没有溢出
无符号运算结果是111111110,有进位
有符号数相加:
次高位(6位)进位,溢出
最高位(7位)进位,溢出
次高位 & 最高位同时进位,不溢出

Dardy 发表于 2013-7-8 16:23:05

无符号加法,“结果放不下”也不会产生溢出,只会出现进位。

有符号加法,“结果放不下”就会产生溢出,并导至结果完全是错的,可能你在做上面的有符号加法时,想着在纸上列坚式,最最位产生了一个“进位”,而结果放不下,但补码加法这个进位进行丢弃,结果才是有符号加法的正确结果,这是补码运算的规则的一部分,数学发现的,必须丢弃。
而溢出标志就是用来告诉你结果是不是正确的。

SF标志记录结果的符号位,也就是结果的最高位,上面的第7位,但只有你当作有符号运算时,SF才有意义,并可通过SF获知结果的正负(你了可以通过结果的最高位来判断,是一样的)

我觉得楼主主要还是对补码运算有疑问。
页: [1]
查看完整版本: 关于溢出的问题想请教一下