Ransford
V2EX  ›  问与答

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

  •  
  •   Ransford · Feb 26, 2014 · 2818 views
    This topic created in 4464 days ago, the information mentioned may be changed or developed.
    例如,x=一1000001(一65),y=一1100000(一96),求x+y。按上面补码加法做,会得到和的补码01011111,符号位为0,结果为一个正数。这显然是错误的。究其原因,这两个数的和为一16l,已超过了8位数据补码表示的范围,出现了溢出,因而导致了错误。
    我的疑问是:现在计算机是通过什么方式来避免这些溢出错误的??求指点~~
    3 replies    1970-01-01 08:00:00 +08:00
    dndx
        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
    Mutoo
        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
    Ransford
        3
    Ransford  
    OP
       Feb 27, 2014
    多谢二位指导~@dndx @Mutoo
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2340 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 15:52 · PVG 23:52 · LAX 08:52 · JFK 11:52
    ♥ Do have faith in what you're doing.