Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++模板如何处理溢出?_C++_Templates_Types_Overflow - Fatal编程技术网

C++模板如何处理溢出?

C++模板如何处理溢出?,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

我已经实现了一个模板函数钳制,因为我的项目不支持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+电压阈值中的溢出。我假设操作数是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。