我试图解决二进制补码内的溢出问题,例如说我试图去掉这两个二进制数:
1111 1000 0100 - 010 111 001 000
我将第二个二进制数转换为两个补码等值,然后简单地将其相加,但我注意到它导致了 1 的溢出,我是否只是忽略溢出?或者有什么规则我必须遵守
1111 1000 0100 + 1010 0011 1000 = (1) 1001 1011 1100
简短回答:
如果您正在对固定宽度的二进制数执行算术运算,使用负数的补码表示,那么是的,您可以忽略一位溢出。
长答案:
你可以考虑每一个i第 1 位n- 位二进制补码表示法的位值为 2^i,对于 0 i < n- 1、带位n- 1(符号位)具有位值-2^(n- 1).那是一个negative符号位的位置值。如果计算两个这样的数字的总和,就好像它们是无符号的一样n位二进制数,这些情况都很好:
- 符号位未在加数或结果中设置(重新解释为二进制补码表示形式),
- 符号位恰好设置在加数之一中,无论溢出如何(如果发生则被忽略),或者
- 符号位在两个加数(因此存在溢出,被忽略)和结果中设置。
为了理解这一点,将问题视为两个单独的和可能更容易:符号位的和以及值(其他)位的和。值和的溢出会产生一个溢出位,其位值为 2^(n-1) -- 恰好是符号位的位置值的倒数 -- 因此这样的溢出cancels一个符号位。
负 + 负的情况需要这样的取消才能使结果可表示(两个符号位 + 一个值溢出 = 一个符号位),而正 + 正的情况不能容纳这样的取消,因为没有可取消的符号位。在正+负的情况下,恰好在结果为非负的情况下存在值位和的溢出;您可以考虑取消负加数的符号位,这会产生与忽略整个无符号和的溢出相同的结果,并将和重新解释为二进制补码数。
其余情况产生的数学结果无法用n-位二进制补码格式——大于最大可表示数,或小于最小数。如果忽略溢出,则可以通过明显的符号翻转来识别此类结果。你用它做什么是错误恢复策略的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)