Py小郑 2022-05-12 18:35 采纳率: 96.6%
浏览 40
已结题

C++关于二分查找的溢出

”“我们都是定义左边界(left)和右边界(right)都使用 int 类型,如果 left 和 right 足够大,mid = (left + right)/2,可能会由于 left+right 导致 int 数据类型越界。所以安全的写法是 mid = left + ((right - left) >> 1) 或者 mid = left + (right - left) / 2,推荐使用右移操作,因为右移比除法快。”“

对于上面这段话,如果说left+right直接相加会导致越界,
那么按照他说的,先进行位运算然后再加上left,不会越界,我的疑惑是,既然m = (left + right)/2 = left + ((right - left) >> 1) ,那么最后边的式子,left加上((right - left) >> 1),数值上不就是等于 (left + right)/2吗,那不就一样数据过大了?

  • 写回答

1条回答 默认 最新

  • 真相重于对错 2022-05-12 20:36
    关注

    自己算一下就知道不一样了,(left+right)这里会溢出 ,再除以2也免除不了上一步的溢出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月20日
  • 已采纳回答 5月12日
  • 创建了问题 5月12日

悬赏问题

  • ¥30 求解达问题(有红包)
  • ¥15 请解包一个pak文件
  • ¥15 不同系统编译兼容问题
  • ¥100 三相直流充电模块对数字电源芯片在物理上它必须具备哪些功能和性能?
  • ¥30 数字电源对DSP芯片的具体要求
  • ¥20 antv g6 折线边如何变为钝角
  • ¥30 如何在Matlab或Python中 设置饼图的高度
  • ¥15 nginx中的CORS策略应该如何配置
  • ¥30 信号与系统实验:采样定理分析
  • ¥100 我想找人帮我写Python 的股票分析代码,有意请加mathtao