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

int isOverflow(uint a, uint b) { // a and b are unsigned non-zero integers. uint c = a * b; if (c  b ? a : b)) return 1; else return 0; } 

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

编辑 :我已经看到其他解决方案,如大数字的乘法,如何捕获溢出 ,使用一些奇特的方法来检查它。 但对我来说,简单的解决方案也看起来正确。 这就是我问这个问题的原因。

通过查找exception很容易certificate这是错误的:

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

这里有正确的答案。

CERT有一个很棒的文件INT30-C。 确保无符号整数操作不包括覆盖所有无符号整数溢出的情况,并检查它们是否提倡乘法需要在执行乘法之前进行测试以防止溢出发生之前( 我修改了示例以适合您的问题 ):

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

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