我有一個計數器在一個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;
你能解釋一下你的陳述嗎?以有符號或無符號進行計算只會將溢出從0/65535傳送到-32768/32768。 – greydet 2011-04-01 14:05:36
對不起,希望現在好多了。 – 2011-04-01 14:24:32
我從來沒有見過這種從unsigned到signed的隱式類型轉換! currentValue - previousValue將始終以無符號形式完成,並且在currentValue溢出的情況下,diff將不會是有效差異。 – greydet 2011-04-01 14:36:15