0

0

c++中如何使用std::midpoint_c++20安全计算中值的方法【详解】

冰火之心

冰火之心

发布时间:2026-02-01 19:38:02

|

453人浏览过

|

来源于php中文网

原创

std::midpoint 是 C++20 引入的安全中点计算函数,避免 (a + b) / 2 的整数溢出问题,语义等价于 ⌊(a+b)/2⌋,要求同类型参数且不支持浮点数。

c++中如何使用std::midpoint_c++20安全计算中值的方法【详解】

std::midpoint 是什么,为什么不用 (a + b) / 2

std::midpoint 是 C++20 引入的工具函数,定义在 头文件中,用于安全计算两个整数或指针的中点值。它解决的核心问题是:(a + b) / 2 在有符号整数上可能溢出(例如 INT_MAX + 1),而 std::midpoint 通过位运算或分段逻辑规避该问题,保证结果始终在合法范围内且数学上等价于向下取整的中点(即 ⌊(a+b)/2⌋)。

如何正确调用 std::midpoint:类型约束与常见编译错误

该函数是函数模板,要求两个参数类型相同,且必须是可比较、可进行算术运算的类型(如 intlong long、指针)。不支持浮点数(C++20 标准未定义浮点重载),也不支持混合类型(如 intunsigned)。

  • ✅ 正确:std::midpoint(10, 20)std::midpoint(ptr1, ptr2)
  • ❌ 编译失败:std::midpoint(10U, 20)(无符号 vs 有符号)、std::midpoint(1.5, 2.5)(浮点数)、std::midpoint(a, b + 1)(若 b + 1 溢出,表达式本身已 UB,不进入 midpoint
  • ⚠️ 注意:必须启用 C++20 或更高标准(如 -std=c++20),否则链接不到或触发 SFINAE 失败

整数中点行为细节:向下取整、负数与边界情况

std::midpoint(a, b) 的语义是 (a + b) / 2 的安全替代,但结果始终等于 a + (b - a) / 2(使用无溢出的差值除法),因此对负数也保持一致:向零取整?不是——它是向负无穷取整(即 floor division)。例如:

文心大模型
文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

下载
std::midpoint(-3, 2) == -1  // (-3 + 2) / 2 = -0.5 → floor → -1
std::midpoint(-4, -1) == -3  // (-4 + -1) / 2 = -2.5 → floor → -3
std::midpoint(0, 1) == 0     // 不是 0.5,因为返回整型
  • 结果类型与参数类型完全一致(不提升)
  • a > b 时仍有效,结果为 ⌊(a+b)/2⌋,可能小于两者(如 std::midpoint(5, 1) == 3
  • 对指针,仅支持同数组内指针(或 one-past-the-end),否则行为未定义

实际使用建议与容易忽略的坑

它不是万能“平均值”函数,而是专为二分查找、内存布局、索引计算等需要严格中点语义的场景设计。别把它当成通用平均工具。

立即学习C++免费学习笔记(深入)”;

  • 不要用于浮点计算:没有重载,强制转换会丢失精度且失去安全优势
  • 不要假设它处理 size_tptrdiff_t 混合:类型必须一致,size_t 是无符号,ptrdiff_t 是有符号,混用直接编译失败
  • 在二分查找中替代 (low + high) / 2 时,确保 lowhigh 同为有符号整型(如都用 int 或都用 ptrdiff_t),否则可能因隐式转换引入新溢出
  • Clang/GCC/MSVC 均已实现,但旧版本 STL(如 libstdc++ __cpp_lib_midpoint 宏

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

503

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

545

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

113

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

200

2025.08.29

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

32

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

23

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

16

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

5

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.5万人学习

Pandas 教程
Pandas 教程

共15课时 | 1万人学习

ASP 教程
ASP 教程

共34课时 | 4.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号