Как обнаружить / предотвратить переполнение счетчика

У меня есть счетчик в 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;
7
задан greydet 1 April 2011 в 12:28
поделиться