这种情况是否足以在乘法中进行溢出检查

时间:2013-11-11 08:48:29

标签: c overflow multiplication

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

我错过了什么吗?我认为上面的代码片段可行。

编辑:我见过其他解决方案,例如multiplication of large numbers, how to catch overflow,它使用了一些奇特的方法来检查它。但对我而言,简单的解决方案看起来也是正确这就是我问这个问题的原因。

2 个答案:

答案 0 :(得分:2)

通过查找异常很容易证明这是错误的:

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

答案 1 :(得分: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;

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