例如,x=一1000001(一65),y=一1100000(一96),求x+y。按上面补码加法做,会得到和的补码01011111,符号位为0,结果为一个正数。这显然是错误的。究其原因,这两个数的和为一16l,已超过了8位数据补码表示的范围,出现了溢出,因而导致了错误。
我的疑问是:现在计算机是通过什么方式来避免这些溢出错误的??求指点~~
我的疑问是:现在计算机是通过什么方式来避免这些溢出错误的??求指点~~
1
dndx Feb 26, 2014
在操作数过大的情况下,溢出是无法避免的,不过 CPU 可以检测溢出并且设置溢出位(x86 实现),程序可以检测溢出位得知运算是否溢出。
参考:https://en.wikipedia.org/wiki/Overflow_flag 至于 ALU 如何检测 Overflow,公式非常简单: http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Comb/overflow.html |
2
Mutoo Feb 26, 2014
要避免溢出,就不能直接使用原生的运算,科研和金融机构通常使用复杂度更高的高精度计算,但更可靠:http://zh.wikipedia.org/zh-cn/%E9%AB%98%E7%B2%BE%E5%BA%A6%E8%AE%A1%E7%AE%97
|