寻找关于以下溢出规避技巧的理论

时间:2019-05-07 01:53:26

标签: java integer-overflow integer-division inequality

以下代码使用了一些我试图理解的整数溢出预防技巧:

// 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),但第三点是解决方法(根据我的测试)。

您能解释一下这背后的理论吗?

1 个答案:

答案 0 :(得分:0)

问题在于涉及整数除法。

  • x * y> = z
  • x> = z /((double)y)

或者积分溢出将是

  • x> = ceil(z /((double)y))

哪个是整数除法(将余数舍去)

  • x> =(z + y-1)/ y

或用不同的措词表示:given z = m*y + n, where 0 <= n < y, 那么对于n == 0,上面的除法将得到m,否则得到m+1的最大值。在下方,x不会溢出。