补码加减法判断进位判断是否溢出的总结

通常我们说的加减法进位方式判断是否溢出一般指的都是补码方式运算下的。无论是一位符号位还是两位符号位,逻辑是相同的。

先由一位符号位说起。
假设是5位机器位,一位用作符号位,四位用作数据位,那么数据的表示范围是:
24 ~ 241
即:-16~15

因此我们上来就看一个溢出的例子,形成一种直观的感受:
-8-9 = -17,果断是溢出的。

补码表示
1,1000
1,0111
=0,1111
得到的数字是+1.
具体发生了什么,你看,符号位发生了进位。但数据位的运算并没有进位
两个负数的符号位一进位,加和的数据居然由负变正了,所以肯定是发生了溢出。如果数据位也进位,就会让符号位还是1,看起来,符号位没有变化,因此检查不出来已经发生了进位。

而在补码运算中,数据位高位为1,其实是比较小的数,除了-8这种刚好卡在边界的,其他较大的,如:

[0]=00000[1]=11111[2]=11110[3]=11101[4]=11100[5]=11011[6]=11010[7]=11001[8]=11000[9]=10111[10]=10110[11]=10101[12]=10100[13]=10011[14]=10010[15]=10001[16]=10000

可以看出来,-7-8 高位数据位进位,符号位也进位,但是并不会溢出。
1213 ,符号位进位,高位进位, 会溢出。
要想举出高位进位,单数符号位不进位的,则可以在两个正数中举,这个比较容易想象,高位进位,表示超出了4位数据位表达的极限,恰好符号位都是0,因此也符合:

只有一个高位进位或者符号位进位就为溢出的规则

而针对两位符号位,其实就是把高位进位和符号位进位表示出来了,比如高位进位到低的符号位得到的10,或者01,就表示溢出了。

而11,00分别表示数据为负,正。

可以这么认为,符号位进位标识SF,和数据位进位标识C,两者不等时,即异或为1时,就产生了溢出。

判断规则很简单,深入理解更重要。

update:第一稿在举例论证的时候补码的计算出现了错误,经过同学的指出,已经更正。这篇的核心就是想说:

  • 数据高位位,符号位进位未进位,溢出。
  • 数据位高位未进位,符号位位,溢出。
  • 数据位高位位,符号位位,不溢出。
  • 数据位高位未进位,符号位未进位,不溢出。

溢出的判断就是这两个标识的组合。从中抽出布尔代数的表达式就是SF与C 异或为1 时判定为溢出。用双符号位时,右边的数符跟踪的是数据位高位是否进位。左边的数符跟踪的是符号位是否进位,这便是用11,00分别作为负数,正数且未溢出的标识,10,01则分别是负数和正数的溢出

不管编码,我们知道整数的计算时,正数与正数相减等同于正数与负数相加不会溢出。只有正数加正数和负数加负数时才可能产生溢出。而这两种情况对应的便是异或为1的两种情况。

此外既然是溢出判断,也可以换个角度从编码表示范围思考。

http://blog.csdn.net/u011240016/article/details/52608128

另外,本篇文章的起因是如何设计PSW中的SF与C的算式表达溢出。
写博客本身并不是说自己就一定对,更多是自己梳理学习过程中的体会。人的认知本身就是不断迭代的过程,我并没标榜自己写出来的文字就一点不出偏差。我很理解读到别人写错的东西时内心的愤怒,想跳过去把博主骂一顿。我已经不是那个要骂回去的年纪的人了,因此只是删了不友好的脏话的评论。另外在CSDN上写博客,本身是对自己的一种督促,如果被被人找到,得到了一点启发,我也是很开心的。

如有错误,谢谢指正,但请保持起码的尊重。

你可能感兴趣的:(组成原理)