以下代码使用了一些我试图理解的整数溢出预防技巧:
// x,y,z are positive numbers
boolean check(long x, long y, long z) {
return x >= (z+y-1)/y;
}
基于问题定义,我认为代码的实际意图是:
return x*y >= z;
作者希望避免整数溢出,其思路如下:
1. x*y >= z
2. x >= z / y //Divide both sides by y
3. x - 1 >= (z - 1) / y //Subtract 1 from left side and dividend
4. x >= (z - 1) / y + 1 //Move 1 to the right side
5. x >= (z + y - 1) / y //Place 1 inside the brackets
第3点是我想要理解的。
第二个不等式与原始意图不相同(例如x = 10,y = 10,z = 101),但第三点是解决方法(根据我的测试)。
您能解释一下这背后的理论吗?
答案 0 :(得分:0)
问题在于涉及整数除法。
或者积分溢出将是
哪个是整数除法(将余数舍去)
或用不同的措词表示:given z = m*y + n, where 0 <= n < y
,
那么对于n == 0,上面的除法将得到m
,否则得到m+1
的最大值。在下方,x
不会溢出。