注册 登录
编程论坛 汇编论坛

of溢出问题

a261935348 发布于 2012-05-27 15:26, 1023 次点击
1.  87H+79H    2.  98H+BAH  3.  46H+5AH  4.   FFH+EEH
帮我算下这几个值的OF值!OF值什么时候溢出?我有点搞不懂!
13 回复
#2
阴阳2012-05-27 16:36
用双进位发判断是否溢出,溢出就是超出你所用数的格式的范围,比如你用的是二位十六进制数,算出的结果就不能超出0ffH
双进位发就是:将最高位的进位与次高位的进位进行异或,结果为1就是溢出,为0就是没有溢出。你先自己算吧,算的时候把十六进制转换成2进制算
#3
有容就大2012-05-27 18:44
对这个也很陌生。貌似要看具体的情况 比如数据的表示形式。这个决定他的表示范围的吧。
网上说 无符号数的相加不考虑溢出;有符号数相加不考虑进位。
这个怎么解啊

我感觉87H+79H = 100H如果是一个字节的无符号数 已经大于0FFH了 OF应该置1才对。怎么会说不考虑?
#4
powlin19912012-05-27 21:21
87H+79H
87H = 10000111b -------------这个是负数,取其补码为01111000,加1后为01111001b = 121,所以就是-121
79H = 01111001b = 121
相加后为0,在 -128 -- 127这个范围内,所以没有溢出,所以OF是0

其他几个是类似的,我也是初学者,算错了的话请各位不要介意。。。
#5
powlin19912012-05-27 21:22
上面说错了,不是取补码,是取反加一。
#6
有容就大2012-05-27 22:13
回复 4楼 powlin1991
问题是 87H 的二进制是 10001111 这个可以看成是135 和 -121的补码 。在16位机里究竟选哪个?
#7
powlin19912012-05-28 22:22
回复 6楼 有容就大
是-121,有符号计算范围是 -128 -- 127
#8
a2619353482012-05-29 09:00
回复 2楼 阴阳
我算了一下第一个87H+79H    10000111
                        +  01111001  
                        = 100000000   那最高位就是1咯次高位是0 那异或的话就是1咯 可是答案为什么是0呢 ?是答案有错呢还是我算错了?
#9
a2619353482012-05-29 09:07
回复 3楼 有容就大
算了一下 好像就是这样算的!谢谢
#10
a2619353482012-05-29 09:10
回复 5楼 powlin1991
负数的反码加1不就是补码么~呵呵
#11
a2619353482012-05-29 09:33
回复 7楼 powlin1991
其他几个都没问题和答案一样了 但是第二个好像有点问题 你看看
98H   10011000 负数取反 01100111 取补 01101000 = 68H 为-104
BAH   10111010 负数取反 01000101 取补 01000101 = 46H 为-70

加起来 为-174 那么没有超过-178 怎么OF是1呢?不是应该是0吗?还是我哪里算的有问题?
#12
有容就大2012-05-29 10:53
下面这个是我在网上看的貌似有点明白了 CF 和 OF 别混了。
程序代码:
当CPU执行指令,进行二进制数字的运算的时候,CPU是不管参加运算的数字是“有符号数”还是“无符号数”,CPU同时给出CF、OF以及其它标志位。
最高位出现了进位,即超过了8位,则进位标志CF=1
而溢出标志,要看高两位的进位,相同则OF=0
----
如果FC和5这两个数,是无符号数,那么就不用关心溢出的问题。
这次运算,代表了:252 + 5 = 1 + CF = 1 +  256 = 257
----
如果FC和5这两个数,是有符号数,那么就不用关心进位的问题。
这次运算,代表了:(-4) + (+5) = +1        OF= 0,结果正确
==================
追问:我想不明白的是,FCh和5h的二进制值相加的结果是100000001,结果是九位的,不是超过了8位的表示范围了吗??为什么这样就不算是溢出呢?
----
结果是九位的!这不明显就是““进位””吗,怎么会联系到““溢出””呢?
楼主可以透露一下你的想法吗?
只有数字是有符号数的时候,才讨论溢出。
如果是无符号数,8位数字的范围是0~255,运算结果是九位数257,只是有进位,CF=1
如果是有符号数,8位数字的范围是-128~+127,现在的结果是+1,所以,OF=0
只有当结果数字超过了-128~+127,才是溢出,而不管它是否为九位数。







            
————
我用双高位法算了下。
87H + 79H  =
 10000111
+01111001  最高位进位是1, 次高位进位是 1 而 1 XOR 1 = 0 , 所以 OF = 0.

98H + BAH  =
 10011000
+10111010  最高位进位是1, 次高位进位是 0 而 1 XOR 0 = 1 , 所以 OF = 1.

46H + 54H =
 01000110
+01010100  最高位进位是0, 次高位进位是 1 而 0 XOR 1 = 1 , 所以 OF = 1.

FFH + EEH =
 11111111
+11101110 最高位进位是1, 次高位进位是 1 而 1 XOR 1 = 0 , 所以 OF = 0.

换成两种方式讨论 8位二进制码是无符号数 数据形式表示范围是 0 - 255
那么 87H + 79H  = 135 + 121 =1 + 255 =  256 > 255  进位标志 CF = 1. 溢出标志 OF = 0 (因为1在 -128 -127之间)
同理下面个在做无符号相加时 只对CF产生影响 OF 不会变的。
如果做有符号处理
87H + 79H  = -121 + 121 = 0 在-128 - 127之间 所以 OF = 0 没溢出 而CF 不可能改变的 因为即使 127 + 127 也只
等于 254 < 255. 下面三个同理。
 




[ 本帖最后由 有容就大 于 2012-5-29 11:05 编辑 ]
#13
a2619353482012-05-29 12:07
回复 12楼 有容就大
谢谢 终于懂了 !
#14
jojo5202012-06-06 13:45
答案还是以二楼的为准。
1