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

标签 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. 请再次检查 - 它扩展为 l + r/2 - l/2l/2 + r/2。请注意,我们不能只使用 l/2 + r/2 因为会有整数截断,所以 3/2 + 5/2 = 1 + 2 = 3,但所需的值为 4

  2. 假设lr都是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))/2 没有整数溢出,因为每个子表达式都保持在 INT_MININT_MAX 之间.

  1. 是的,打错了!

关于c++ - 使用 l+(r-l)/2 避免溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53939514/

相关文章:

c++ - 如何理解scoped_lock的析构函数?cppreference是不是出错了?

c++ - BLOB 上的核心转储通过 ODBC 插入 informix

C++ 方法继承,返回类型取决于类

java - 尝试通过一些修改来实现合并排序

java - 是否有节省空间的合并排序实现?

Haskell 长度列表 + 阶乘

java - 阶乘函数产生 21 的错误结果!以上

c++ - malloc() 和虚函数有什么问题?

c++ - 在 C++ 中正确组合归并排序和插入排序

python : overflow while subtraction