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,它使用了一些奇特的方法来检查它。但对我而言,简单的解决方案看起来也是正确这就是我问这个问题的原因。
答案 0 :(得分:2)
通过查找异常很容易证明这是错误的:
考虑这两个8位无符号值:a = 0x1F
和b = 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;
这是您问题的直接解决方案,它已经解决,您应该使用已经证明有效的解决方案,提出您自己的解决方案可能容易出错。