使用l +(r-l)/ 2避免溢出

时间:2018-12-27 03:46:55

标签: c++ mergesort integer-overflow

当我学习合并排序实现时,遇到了以下代码:

// Same as (l+r)/2, but avoids overflow for 
// large l and h 
int m = l+(r-l)/2;
  1. (l + r)/ 2与l +(r-l)/ 2相同吗?后者的值为r / 2。

  2. (l + r)/ 2如何引起溢出,l +(r-l)/ 2如何解决此问题?

  3. 什么是h? (我认为这是错字,本来应该是r)

1 个答案:

答案 0 :(得分:2)

  1. 请再次检查-它会扩展为l + r/2 - l/2的{​​{1}}。请注意,我们不能仅使用l/2 + r/2,因为会出现整数截断,因此l/2 + r/2 = 3/2 + 5/2 = 1 + 2,但是所需的值为3

  2. 假设4l均为类型r的正值。

如果我们有:

int

然后int l = INT_MAX - 2; int r = INT_MAX; 部分为l + r,这是整数溢出。 INT_MAX - 2 + INT_MAX没有整数溢出,因为每个子表达式都保持在INT_MAX - 2 + (INT_MAX - (INT_MAX - 2))/2INT_MIN之间。

  1. 是的,这是一个错字!