关于计算机运算溢出的疑问

2014-02-26 14:50:24 +08:00
 Ransford
例如,x=一1000001(一65),y=一1100000(一96),求x+y。按上面补码加法做,会得到和的补码01011111,符号位为0,结果为一个正数。这显然是错误的。究其原因,这两个数的和为一16l,已超过了8位数据补码表示的范围,出现了溢出,因而导致了错误。
我的疑问是:现在计算机是通过什么方式来避免这些溢出错误的??求指点~~
2353 次点击
所在节点    问与答
3 条回复
dndx
2014-02-26 15:00:27 +08:00
在操作数过大的情况下,溢出是无法避免的,不过 CPU 可以检测溢出并且设置溢出位(x86 实现),程序可以检测溢出位得知运算是否溢出。

参考:https://en.wikipedia.org/wiki/Overflow_flag

至于 ALU 如何检测 Overflow,公式非常简单:
http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Comb/overflow.html
Mutoo
2014-02-26 16:35:52 +08:00
要避免溢出,就不能直接使用原生的运算,科研和金融机构通常使用复杂度更高的高精度计算,但更可靠:http://zh.wikipedia.org/zh-cn/%E9%AB%98%E7%B2%BE%E5%BA%A6%E8%AE%A1%E7%AE%97
Ransford
2014-02-27 08:15:26 +08:00
多谢二位指导~@dndx @Mutoo

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/101954

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX