c++ - C++ 模板如何处理溢出?
问题描述
我已经实现了一个模板函数“clamp”,因为我的项目不支持 C++20。
template<typename T>
constexpr const T clamp(const T& value, const T& lo, const T& hi)
{
return static_cast<T>(std::min(std::max(lo, value), hi));
}
我正在使用它以下列方式检查溢出。
if (adcVal > clamp<uint16_t>((adcHi + voltageThreshold), adcHi, std::numeric_limits<uint16_t>::max()))
{
//voltage has jumped past required threshold.
}
是否保证溢出值将保留为uint16_t
?
解决方案
是否保证溢出值将保留为 uint16_t?
我怀疑你的意思是溢出adcHi + voltageThreshold
。我假设操作数是uint16_t
.
不,没有这样的保证。在典型系统上,uint16_t
操作数首先会被提升为int
,结果也将是int
。并且总和可能超出 的可表示值uint16_t
。
当然,一旦加法的结果被转换为uint16_t
当传递给时clamp
,它就保证是一个uint16_t
。
传递std::numeric_limits::max()
给钳位将意味着输入不会从上限钳位,因为它永远不会大于限制。
C++ 模板如何处理溢出?
溢出发生在调用函数模板之前。
推荐阅读
- javascript - Eslint 解析错误:`Unexpected token <` 由下划线模板引起
- python - 在 Keras 中训练时出现无效的参数错误
- python - 优化熊猫应用回顾前行中间计算
- python-3.x - 如何从轴获取网格线的可见性?
- jquery - 通过ajax提交表单时未定义的索引用户
- packer - 无法使用带有 private_key 身份验证的打包程序在 virtualbox 中创建 OVA
- ruby - RVM 通过 repo 文件自动检测 Ruby 版本的功能在 VSCode 登录 shell 终端中不起作用
- java - 实现自定义注解
- javascript - 如何重写这个双箭头函数
- c# - Stackify 不在 ASP.NET Core 中使用代理