补码运算溢出后结果怎么写(补码运算结果溢出怎么求原码)
导语:补码运算溢出检测及解决方法
补码运算的基本公式如下:
当进行补码运算的时候,不可避免会产生溢出问题:
上图中,+89和+108的符号位都是0,最高数值位都是1,最高数值位产生进位,前者则没有,结果产生溢出。
再看小数补码的定义:
上图中的最高溢出位1去除不要。
上图则是产生了溢出的情况。两个小数之和如果超过1,则肯定产生溢出;两个整数之和如果超过了最大位数(比如两位十进制能表示的最大数字是99)则产生溢出,上图中A-B的结果是-138,138超过了7位二进制能表示的最大数字127,因此产生了溢出。
对于小数溢出的检测,通常采用如下双符号位:
假设x=-0.110,y=-0.101 两个负数的绝对值都大于0.5,结果应该溢出:
取双符号位, 最后答案: 10 .101 有溢出
再考虑x=-0.010,y=-0.101 两个负数的绝对值没有同时大于0.5,结果应该无溢出:
最后答案: 11 .101 无溢出
由以上例子可以看出,当两个负数的绝对值都大于0.5的时候,其补码相加时最高数值位不会产生进位,从而导致双符号不一致,得出溢出的结论;而当两个负数的绝对值没有同时大于0.5,其补码相加时最高数值位会产生进位,得出结果无溢出。这种情形可以通过理论予以证明,我们这里只需要稍微了解一下。
那么,溢出以后如何解决呢?
假设求:-6+(-3)
-6的原码:1 110 -3的原码:1 011
-6的补码:1 010 -3的补码:1 101
由于包括符号位是四位,所以结果是0 100,是一个正数,明显产生了溢出。
为了解决这个问题,将数值位宽度增大为4位,则
-6的原码:1 0110 -3的原码:1 0011
-6的补码:1 1010 -3的补码:1 1101
最后结果是5位:1 0111 。由于这个结果是补码,再求其原码得到 1 1001,也就是-9,答案是正确的。
本文内容由小舻整理编辑!