当我学习合并排序实现时,遇到了以下代码:
// Same as (l+r)/2, but avoids overflow for
// large l and h
int m = l+(r-l)/2;
(l + r)/ 2与l +(r-l)/ 2相同吗?后者的值为r / 2。
(l + r)/ 2如何引起溢出,l +(r-l)/ 2如何解决此问题?
什么是h? (我认为这是错字,本来应该是r)
答案 0 :(得分:2)
请再次检查-它会扩展为l + r/2 - l/2
的{{1}}。请注意,我们不能仅使用l/2 + r/2
,因为会出现整数截断,因此l/2 + r/2
= 3/2 + 5/2
= 1 + 2
,但是所需的值为3
。
假设4
和l
均为类型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))/2
和INT_MIN
之间。