在实现二分查找算法时,为什么使用low + (high - low) / 2,而不使用(high + low) / 2呢?目的是为了防止溢出!

  使用(low+high)/2会有整数溢出的问题,问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)不存在这个问题。

  例如,high = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824
     low = 0100 0000 0000 0000 0000 0000 0000 0000 = 1073741824
     high + low = 1000 0000 0000 0000 0000
            = -2147483648 as signed 32-bit integer
  作为带符号的32位整数,它是溢出的并且翻转为负。因此(high + low) / 2是错误的,因为high + low的运算结果可能超出当前类型所表示的范围的。

  例子的验证代码如下所示。

#include<iostream>
using namespace std;int main()
{int a = 1073741824;  // 1073741824 = 0100 0000 0000 0000 0000 0000 0000 0000int b = 1073741824;// a + b = -2147483648 as signed   32-bit integerint result1 = (a + b) / 2;  // result1 = -1073741824int result2 = a + (b - a) / 2;  // result2 = 1073741824cout << "a:" << a << endl;cout << "b:" << b << endl;cout << "a+b:" << a + b << endl;cout << "(a+b)/2 的计算结果:" << result1 << endl;cout << "a+(b-a)/2 的计算结果:" << result2 << endl;system("pause");return 0;
}

a:1073741824
b:1073741824
a+b:-2147483648
(a+b)/2 的计算结果:-1073741824
a+(b-a)/2 的计算结果:1073741824

为防止整数溢出问题,使用low + (high - low) / 2而不是(high + low) / 2相关推荐

  1. 殊途同归的CVE-2012-0774 TrueType字体整数溢出漏洞分析

    1. 前言 官方的漏洞通报中,关于这个漏洞的信息其实很少: Integer overflow in Adobe Reader and Acrobat 9.x before 9.5.1 and 10.x ...

  2. BUUCTF-pwn2_sctf_2016(整数溢出+泄露libc)

    32位开启了nx保护 没有看到system和'/bin/sh',开启了NX保护,是泄露libc类型的题目 main函数就调用了一个vuln函数 7行的输入函数不是get,是程序自定义的函数get_n ...

  3. Android libcutils库中整数溢出导致的堆破坏漏洞的发现与利用

    作者:龚广(@oldfresher) 阅读本文之前,您最好理解Android中的Binder机制.用于图形系统的BufferQueue原理.堆管理器je_malloc的基本原理. 此文介绍了如何利用l ...

  4. 转载:力扣:整数翻转(难点:整数溢出)

    (力扣)LeetCode刷题之整数反转 陈鹏 既存一息,多言无益. ​关注他 8 人赞同了该文章 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 ...

  5. C++两个整数的总和是否为整数溢出的算法实现(附完整源码)

    C++两个整数的总和是否为整数溢出的算法实现 C++两个整数的总和是否为整数溢出的算法实现完整源码(定义,实现,main函数测试) C++两个整数的总和是否为整数溢出的算法实现完整源码(定义,实现,m ...

  6. 语言余一个负数_C语言学习日记(8)——整数溢出

    小时候喜欢玩电子计算器,觉得很神奇,想要算什么数,立刻就能算出来.当时看着计算器的液晶屏幕就想,如果算一个很大的数,超过了屏幕上面数字的位数,会怎么样呢?试了以后结果是INF,那就是无穷大了.虽然当时 ...

  7. xp正版验证补丁_实操web漏洞验证——IIS HTTP.sys 整数溢出漏洞

    一.漏洞描述 Http.sys 是一个位于 Windows 操作系统核心组件,能够让任何应用程序通过它提供的接口,以 Http 协议进行信息通讯.微软在 Windows 2003 Server 里引进 ...

  8. linux内核io源码,Linux Kernel do_io_submit()函数整数溢出漏洞

    发布日期:2010-09-21 更新日期:2010-09-27 受影响系统: Linux kernel 2.6.x 不受影响系统: Linux kernel 2.6.36-rc4 描述: ------ ...

  9. 一种被忽视的构造和整数溢出重现

    Michael Howard Secure Windows Initiative 摘要:Michael Howard 研究了一种常常被忽略的代码构造,这种构造可能会导致严重的缓冲区溢出问题,然后介绍了 ...

最新文章

  1. 第二十一篇:伦理/道德Ethics
  2. 告别2010,迎来2011
  3. Android 高仿新浪微博底部导航栏,实现双击首页Tab,页面的ListView滚动、刷新
  4. .NET DLR 上的IronScheme 语言互操作IronScheme控制台输入中文的问题
  5. 1971 John McCarthy--人工智能之父和LISP语言的发明人(ZT)
  6. 爱了!华为Mate X 2外观专利图公布:机身更圆润
  7. 能量收集matlab程序_深港微电子学院汪飞课题组在Sensors and Actuators A: Physical上发表双谐振能量采集器论文...
  8. LIRe 源代码分析 3:基本接口(ImageSearcher)
  9. 3D游戏学习 案例游戏设计分析——英雄联盟设计浅析
  10. 猿创征文|【FreeSwitch开发实践】使用sipp对FreeSwitch进行压力测试
  11. 微信公众平台被动回复用户消息开发全步骤
  12. mysql 100个标题_100个超强吸引人的标题100个吸引人的标题
  13. 群晖NAS 7.X版搭建博客网站,并内网穿透发布公网可访问 8-8
  14. 微软文本转语音小工具(Text to speech)网页版
  15. C++实验题8 数组使用(bushi)
  16. 蓝桥杯 砝码称重【第十二届】【动态规划】以及一些总结
  17. 丢手帕问题 java_java入门小程序—17人游戏(丢手绢问题) | 学步园
  18. Easy Excel读取复杂表格文件
  19. 【TIFF】一.TIFF 格式详解
  20. 【数学建模笔记】【第七讲】多元线性回归分析(一): 回归分析的定义、对于线性的理解以及内生性问题的探究

热门文章

  1. SIM800C通讯模块调试(一)
  2. 三年308%投资回报!IDC点评戴尔科技存储家族
  3. python-数据思维
  4. 放开我们追梦的翅膀——致所有无私的父母
  5. 妻子照顾高位截瘫丈夫16年:和你一直到老挺知足
  6. Spring Boot进阶(17):如何在Swagger2中配置header请求头等参数?若不会,我便手把手教你 | 超级详细,建议收藏
  7. 理化生标准化实验考场产品培训
  8. 电商美工psd文件_PS教程:10个创建PS专业和有组织PSD文件的技巧
  9. 中转站有容量限制的运输问题(最小费用最大流)
  10. web开发中经常使用到的代码(csdn中下载的资源)