【问题标题】:does this condition suffice for overflow check in multiplication [duplicate]这种条件是否足以在乘法中进行溢出检查[重复]
【发布时间】:2013-11-11 08:48:29
【问题描述】:
    int isOverflow(uint a, uint b) {
        // a and b are unsigned non-zero integers.
        uint c = a * b;

        if (c < ( a > b ? a : b))
                return 1;
        else
                return 0;
}

我错过了什么吗?我认为上面的 sn-p 会起作用。

EDIT :我见过像multiplication of large numbers, how to catch overflow 这样的其他解决方案,它使用一些花哨的方法来检查它。但对我来说,上面的简单解决方案看起来也是正确的。这就是我问这个问题的原因。

【问题讨论】:

    标签: c overflow multiplication


    【解决方案1】:

    通过发现异常很容易证明这是错误的:

    考虑这两个 8 位无符号值:a = 0x1Fb = 0xF

    c = a * b
    c = 0x1F * 0xF
    c = 0xD1              (Overflow! The real answer is 0x1D1)
    
    c < ( a > b ? a : b)
    0xD1 < 0x1F           => False  (Wrong!)
    

    正确答案是here

    【讨论】:

      【解决方案2】:

      CERT 有一个很棒的文档 INT30-C. Ensure that unsigned integer operations do not wrap,它涵盖了 无符号整数溢出 的所有情况,并检查了他们提倡的 for multiplications 要求您在执行乘法之前进行测试在溢出发生之前防止溢出(我修改了示例以适应您的问题):

      if (a > SIZE_MAX / b) {
        /* Handle error condition */
      }
      
      c = a * b;
      

      这是对您的问题的直接解决方案,它已得到解决,您应该使用已被证明有效的解决方案,提出您自己的解决方案可能容易出错。

      【讨论】:

      • 在许多处理器上,乘法比除法更有效。我认为使用函数来确定产品是否可表示比在整个地方抛出大量整数除法更干净。
      猜你喜欢
      • 2019-01-23
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多