二分查找中不能用 (low + high) / 2 因整数溢出导致未定义行为,如 low = INT_MAX - 1、high = INT_MAX 时加法结果为负,引发静默越界或崩溃;std::midpoint 是 C++20 安全替代,但需类型匹配且不校验区间有效性。

二分查找里为什么不能用 (low + high) / 2
因为整数溢出不是报错,而是直接触发未定义行为(UB)。比如 low = INT_MAX - 1、high = INT_MAX,加起来就变成负数,后续用它当数组下标,程序可能静默越界或崩溃。这不是小概率事件——处理大容器、64 位索引(size_t)、或 mmap 映射的超大内存时极易复现。
常见误判是“数据没那么大,不会出事”,但编译器不会帮你检查运行时值;更麻烦的是,这种 bug 往往只在特定硬件或优化等级下暴露,调试成本极高。
-
(low + high) / 2在有符号整型上风险最高,无符号类型虽不溢出但会回绕(right 时right - left变成极大正数) - 即使你用
size_t,也得额外写if (high >= low)判断,否则减法回绕后除以 2 还是错的 - 手写
low + (high - low) / 2是可行替代,但需确保类型一致、括号完整,且无法覆盖指针场景
std::midpoint 在二分中怎么写才对
它不是“换个函数名就行”,关键在类型匹配和调用上下文。C++20 要求两个参数必须是同一类型,且对指针有严格限制。
正确写法示例:
size_t
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











