搜索
写经验 领红包

补码运算溢出后结果怎么写(补码运算结果溢出怎么求原码)

导语:补码运算溢出检测及解决方法

补码运算的基本公式如下:

当进行补码运算的时候,不可避免会产生溢出问题:

上图中,+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,答案是正确的。

本文内容由小舻整理编辑!