2
    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;
}

我错过了什么吗?我认为上面的片段会起作用。

编辑:我见过其他解决方案,比如大数的乘法,如何捕捉溢出,它使用一些花哨的方法来检查它。但对我来说,上面的简单解决方案看起来也是正确的。这就是我问这个问题的原因。

4

2 回答 2

3

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

考虑这两个 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!)

正确答案在这里

于 2013-11-11T12:02:47.373 回答
3

CERT有一个很棒的文档INT30-C。确保无符号整数运算不换行,这涵盖了无符号整数溢出的所有情况,并检查他们提倡的乘法要求您在执行乘法之前进行测试以防止溢出发生(我修改了示例以适合您的问题):

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

c = a * b;

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

于 2013-11-12T02:54:32.717 回答