C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何检测/防止计数器溢出大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在16位字段上有一个计数器,它由硬件外设随时间递增/递减.
我定期对其值进行采样,将差值加到32位字段中.

我的问题是在计算差异时检测16位字段的上溢/下溢.

我们来举个例子:
在样本n-1处,计数器值Vn-1是65530.
作为样本n,计数器值Vn是4.
计数器已增加10.但差值(Vn – Vn-1)将类似于65529(不确定精确值).

我发现检测此溢出的唯一方法是将差值与大于最大增量的固定值进行比较(我选择10000).
您是否知道在不与此主观价值进行比较的情况下管理此溢出的解决方案?

这是一个代码例:

static sint32 overallCount = 0;
sint32 diff;
static sint16 prevIoUsValue = 0;
sint16 currentValue;

currentValue = sampleValue();

diff = ((sint32) currentvalue) - prevIoUsValue;
if(diff > 10000) {
    diff -= 65536;
} else if ((-diff) > 10000) {
    diff += 65536;
}

overallCount += diff;

解决方法

我之前的回答有一些错误,所以我重写了它,但想法是一样的,正确使用无符号类型.

使currentValue和prevIoUsValue都是所选大小的无符号整数(例如uint16_t).然后只是减去它们.因为如果int是比uint16_t更大的类型,则差异将被隐式提升为int,您需要将结果转换或隐式转换回uint16_t.所以:

static uint16_t prevIoUsValue;
uint16_t currentValue = sampleValue();
uint16_t diff = currentValue - prevIoUsValue;

这会在赋值中使用隐式转换,但如果您愿意,可以进行转换.

大佬总结

以上是大佬教程为你收集整理的如何检测/防止计数器溢出全部内容,希望文章能够帮你解决如何检测/防止计数器溢出所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。