V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Ransford
V2EX  ›  问与答

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

  •  
  •   Ransford · 2014-02-26 14:50:24 +08:00 · 2414 次点击
    这是一个创建于 3916 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如,x=一1000001(一65),y=一1100000(一96),求x+y。按上面补码加法做,会得到和的补码01011111,符号位为0,结果为一个正数。这显然是错误的。究其原因,这两个数的和为一16l,已超过了8位数据补码表示的范围,出现了溢出,因而导致了错误。
    我的疑问是:现在计算机是通过什么方式来避免这些溢出错误的??求指点~~
    3 条回复    1970-01-01 08:00:00 +08:00
    dndx
        1
    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
        2
    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
        3
    Ransford  
    OP
       2014-02-27 08:15:26 +08:00
    多谢二位指导~@dndx @Mutoo
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2852 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:27 · PVG 17:27 · LAX 01:27 · JFK 04:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.