进位位判别法_补码加减法判断进位判断是否溢出的总结
通常我们说的加减法进位⽅式判断是否溢出⼀般指的都是补码⽅式运算下的。⽆论是⼀位符号位还是两位符号位,逻辑是相同的。
先由⼀位符号位说起。
假设是5位机器位,⼀位⽤作符号位,四位⽤作数据位,那么数据的表⽰范围是:
−24 ~ 24−1
即:-16~15
因此我们上来就看⼀个溢出的例⼦,形成⼀种直观的感受:
-8-9 = -17,果断是溢出的。
补码表⽰
1,1000
1,0111
=0,1111
得到的数字是+1.
具体发⽣了什么,你看,符号位发⽣了进位。但数据位的运算并没有进位。
两个负数的符号位⼀进位,加和的数据居然由负变正了,所以肯定是发⽣了溢出。如果数据位也进位,就会让符号位还是1,看起来,符号位没有变化,因此检查不出来已经发⽣了进位。
⽽在补码运算中,数据位⾼位为1,其实是⽐较⼩的数,除了-8这种刚好卡在边界的,其他较⼤的,如:
[0]补=0,0000[−1]补=1,1111[−2]补=1,1110[−3]补=1,1101[−4]补=1,1100[−5]补=1,1011[−6]补=1,1010[−7]补=1,1001[−8]补=1,1000[−9]补=1,0111[−10]补=1,0110[−11]补=1,0101[−12]补=1,0100[−13]补=1,0011[−14]补=1,0010[−15]补=1,0001[−16]补=1,0000
可以看出来,-7-8**⾼位数据位进位,符号位也进位**,但是并不会溢出。
-12-13,符号位进位,⾼位进位, 会溢出。
要想举出⾼位进位,单数符号位不进位的,则可以在两个正数中举,这个⽐较容易想象,⾼位进位,表⽰超出了4位数据位表达的极限,恰好符号位都是0,因此也符合
只有⼀个⾼位进位或者符号位进位就为溢出的规则。
⽽针对两位符号位,其实就是把⾼位进位和符号位进位表⽰出来了,⽐如⾼位进位到低的符号位得到的10,或者01,就表⽰溢出了。
⽽11,00分别表⽰数据为负,正。
可以这么认为,符号位进位标识SF,和数据位进位标识C,两者不等时,即异或为1时,就产⽣了溢出。
判断规则很简单,深⼊理解更重要。
update:第⼀稿在举例论证的时候补码的计算出现了错误,经过同学的指出,已经更正。这篇的核⼼就是想说:
数据⾼位进位,但是符号位进位未进位,溢出。
数据位⾼位未进位,但是符号位进位,溢出。
数据位⾼位未进位,符号位进位,不溢出。
数据位⾼位未进位,符号位未进位,不溢出。
溢出的判断就是这两个标识的组合。从中抽出布尔代数的表达式就是SF与C**异或为1**时判定为溢出。⽤双符号位时,右边的数符跟踪的是数据位⾼位是否进位。左边的数符跟踪的是符号位是否进位,这便是⽤11,00分别作为负数,正数且未溢出的标识,10,01则分别是负数和正数的溢出。
不管编码,我们知道整数的计算时,正数与正数相减等同于正数与负数相加不会溢出。只有正数加正数和负数加负数时才可能产⽣溢出。⽽这两种情况对应的便是异或为1的两种情况。
此外既然是溢出判断,也可以换个⾓度从编码表⽰范围思考。
两个负数的补码相加另外,本篇⽂章的起因是如何设计PSW中的SF与C的算式表达溢出。
写博客本⾝并不是说⾃⼰就⼀定对,更多是⾃⼰梳理学习过程中的体会。⼈的认知本⾝就是不断迭代的过程,我并没标榜⾃⼰写出来的⽂字就⼀点不出偏差。我很理解读到别⼈写错的东西时内⼼的愤怒,想跳过去把博主骂⼀顿。我已经不是那个要骂回去的年纪的⼈了,因此只是删了不友好的脏话的评论。另外在CSDN上写博客,本⾝是对⾃⼰的⼀种督促,如果被被⼈到,得到了⼀点启发,我也是很开⼼的。
如有错误,谢谢指正,但请保持起码的尊重。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论