gpt4 book ai didi

c - 如何检测/防止计数器溢出

转载 作者:太空狗 更新时间:2023-10-29 17:09:04 26 4
gpt4 key购买 nike

我在 16 位字段上有一个计数器,该计数器随时间由硬件外围设备递增/递减。
我定期对其值进行采样,将差值加到一个 32 位字段中。

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

举个例子:
在样本n-1,计数器值Vn-1为65530。
作为样本n,计数器值Vn为4。
计数器已递增 10。但差值 (Vn - Vn-1) 将类似于 65529(不确定确切值)。

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

这是一个代码示例:

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;

这在赋值中使用了隐式转换,但如果您愿意,也可以强制转换。

关于c - 如何检测/防止计数器溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5513353/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com