- [游客] 说的不错,但是现在国人能有多少个学习这个的时候还能有开拓视野的想法。。。 04/08 09:13
- [scuzg] 0fch展开成二进制数: 11111100,其中最高位是符号位,所以: 7ch+4=80h=12 12/20 19:05
- [842460904] 理论是应该负数原码和补码数值之和等于128,可为什么。fc和它的补码-4相加,即252+(-4)=? 09/03 23:38
- [fpamc] 顶顶…… 05/25 09:49
- [scuzg] 20位,图中有说明。 12/29 15:45
- [scuzg] 表示8位二进制数的16进制数fdh,因高位是f,所以前面前缀0以区别于标识符,也就是说,当对应8位二 12/29 15:42
- [powerofthinking] 博主的文章不错,希望再多写几篇。 12/18 13:40
- [游客] 请问0fdh为什么不是0000 1111 1101 b ?如果最高位视为符号位,它就是一个带符号数, 12/17 23:08
- [游客] 请问scuzg老师,地址加法器是多少位的啊(物理连接结构)?寄存器是16位,地址线20位,地址加法器 12/17 23:02
- [游客] 地址译码逻辑是不是应该在CPU内部啊? 我也觉得文章有点问题,还有就是看了scuzg老师很多文章, 12/17 22:59
- [qqqun238564439] 厉害 04/10 10:57
- [suixin] 少了个你,呵呵 “看着你的回答真长见识” 12/01 09:31
- [suixin] 看着的回答真长见识 12/01 09:29
- [fangorc] 先弄个友情链接,老师这的好东西太多了,慢慢消化~ 08/07 22:03
- [zdpopup] 谢谢scuzg 的宝贵意见,我看了2次你的话 08/05 01:43
- [游客] 过来踩踩。哈哈!端他爸 08/03 11:28
[2009-07-21 08:10] 补码运算时的溢出判断
①只有真正意义上的相加才可能溢出,比如:
正+正,负+负,正-负,负-正
纯粹的减法是不可能溢出的,这一点仅需常识即可作出判断,所以遇到不是真正意义上的加法运算(当然,包括乘法和左移等)要你判断是否有溢出,直接就可以回答:OF=0;
②两正数之和的数值部分向符号位进位,显然是运算结果超过了指定位数的带符号数的表示范围,这就是典型的溢出;
③两负数之和的溢出判断是我们讨论的重点。我们先考察一下负数原码和补码数值部分之间的关系:以8位补码为例,负数原码和补码数值部分之和始终等于128(见上图)。由于这种关系,当原码数值大时对应的补码数值就小,反之也一样。所以,当两补码表示的负数的数值部分之和没有向符号位进位,说明两负数的原码之和必然向符号位进位,即发生溢出;反之,当两补码表示的负数的数值部分之和向符号位进位,那么对应两负数原码的数值之和就不可能向符号位进位,即运算结果没有溢出;并且在这种情形下补码之和的数值部分向符号位的进位,修正了两负数符号位相加本位为零的问题,使得两负数之和依然是个负数。
下面看两个负数补码相加溢出判断的实例:
例一:085h + 9ch
= 10000101b + 10011100b
两数相加,数值部分不会向符号位进位,这是不是就说明没有溢出呢?但由于计算结果为正,显然不对。我们还是看看两个数的原码之和再说:
10000101b的原码 = 11111011b(-123)
10011100b的原码 = 11100100b(-100)
显然,原码之和的数值部分将向符号位进位,显然是溢出无疑。
例二:0e7h + 0b3h
=11100111b + 10110011b
两数相加,数值部分会向符号位进位,这进位是溢出吗?还是看看原码吧!
11100111b的原码 = 10011001b(-25)
10110011b的原码 = 11001101b(-77)
容易看出,两数原码之和没有向符号位进位,即没有发生溢出。
其实归结起来,补码的溢出判断规则就一句话:
同号数相加如果结果的符号位和两加数不同,既是溢出。
这自然说明了:
⑴不是同号数相加,则不可能溢出;
⑵同号数相加有可能溢出;
⑶同号数相加如果结果的符号位和两加数不同,既是溢出。
[ younggay 发表于 2009-07-22 09:59 ]
up
[ zhonghuade 发表于 2009-10-18 19:23 ]
老师!我觉得可以加一些实际的例子来说明补码溢出,比如说:8位机器数运算表示范围-128大于等于x小于等于127,发生溢出的具体情况?用实例来说明能让我们更深刻理解溢出的含义!请您指点!谢谢!
[ release_lag 发表于 2009-12-31 16:48 ]
呵呵,没想到我和楼主想到一起去了。
=============================
回楼上的
如果是两个8位数据相加
第一个加数的范围是:0ffH~80H(负数的范围)
第二个加数的范围是:0H~79H(正数的范围)
那么他们永远不会溢出
原因是他们符号不同,楼主已经说过:不同符号的两数相加,结果不可能溢出
同符号相加时,就检查结果的符号,如果符号与两个数据的符号不同时,则溢出
例如mov al,0e0h
add al,95H
结果是(al)=75H ;75H为正数,运算溢出
[ 游客 发表于 2011-01-01 21:53 ]
顶
[ 游客 发表于 2011-12-17 22:33 ]
文章很不错,可是还有很多地方不太明白。
1、(八位补码溢出判断图示)是根据什么原理推断出来的啊?负数原码和补码数值部分之和始终等于128,为什么?
2、只有真正意义上的相加才可能溢出,什么是真正意义上的相加?
3、请问什么是溢出?文中提到:两正数之和的数值部分向符号位进位,显然是运算结果超过了指定位数的带符号数的表示范围,这就是典型的溢出。运算结果超过了指定位数的带符号数的表示范围——这句话如何理解?不是同号数相加,则不可能溢出,超不超出范围如何判断?
[ 842460904 发表于 2012-09-03 23:38 ]
理论是应该负数原码和补码数值之和等于128,可为什么。fc和它的补码-4相加,即252+(-4)=?好像不在128-127之间。为什么,能解答下吗。谢谢
[ scuzg 发表于 2012-12-20 19:05 ]
0fch展开成二进制数:
11111100,其中最高位是符号位,所以:
7ch+4=80h=128
际原码和补码数值部分之和是128.