C++模板如何处理溢出?
我已经实现了一个模板函数钳制,因为我的项目不支持C++20C++模板如何处理溢出?,c++,templates,types,overflow,C++,Templates,Types,Overflow,我已经实现了一个模板函数钳制,因为我的项目不支持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<uin
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+电压阈值中的溢出。我假设操作数是uint16\t
不,没有这样的保证。在典型系统上,uint16_t操作数将首先提升为int,结果也将是int。并且总和可能超出uint16_t的可表示值
当然,一旦加法的结果在传递到clamp时转换为uint16_t,就保证它是uint16_t
将std::numeric_limits::max传递给climp将意味着输入不会从上限进行钳制,因为它永远不会大于限制
如何处理C++模板句柄溢出?< /P> 溢出发生在调用函数模板之前
是否保证溢出值将保持为uint16\t 我猜你的意思是adcHi+电压阈值中的溢出。我假设操作数是uint16\t 不,没有这样的保证。在典型系统上,uint16_t操作数将首先提升为int,结果也将是int。并且总和可能超出uint16_t的可表示值 当然,一旦加法的结果在传递到clamp时转换为uint16_t,就保证它是uint16_t 将std::numeric_limits::max传递给climp将意味着输入不会从上限进行钳制,因为它永远不会大于限制如何处理C++模板句柄溢出?< /P>
溢出发生在调用函数模板之前。如果参数是简单的整数值,则不要通过引用获取参数。假设adcHi+VoltageSthreshold没有溢出uint16\t,则为“是”。如果存在溢出,则需要单独检测。您的clamp函数无法检测到这一点,因为在查看该值时,该值已溢出。如果参数是简单的整数值,则不要通过引用获取参数。假设adcHi+VoltageSthreshold没有溢出uint16,则选择“是”。如果存在溢出,则需要单独检测。钳位函数无法检测到这一点,因为该值在开始查看时已溢出。是的,我关注adcHi+VoltageSThreshold中的溢出,操作数都是uint16\u t。是的,我关注adcHi+VoltageShold中的溢出,操作数都是uint16\t。