Пользовательское обнаружение переполнения - PullRequest
0 голосов
/ 29 февраля 2012

Я делаю некоторую работу с тессеральной арифметикой, и мне нужно обнаружить переносы в определенных областях слова.Из-за характера программы расположение битов зависит от ввода.Например, с 32-битным размером слова и, скажем, входным сигналом в 6 битов, мне было бы интересно проверить биты 19 и 3 для сложения переносов и биты 31 и 15 для вычитания (в общем, интересные биты: (размер слова- 1), (размер слова / 2 + входные биты / 2), (размер слова / 2 - 1) и (входные биты / 2)).

Я думаю, что-то вроде:

  (after addition)         ((NumberToCheck & (1 << 19 + 1 << 3)) != 0)  --> carried bit(s)

  (or after subtraction)   ((NumberToCheck & (1 << 31 + 1 << 15)) != 0) --> carried bit(s)

Есть ли лучший подход к этому?

1 Ответ

1 голос
/ 02 марта 2012

Вы можете найти все переносы из целых чисел a, b и их сумму s, вычислив carry-ins = a XOR b XOR s.

Естественно, переносы также являются переносами из непосредственно предшествующих битовых позиций.

Наиболее значимое выполнение (которое указывает на переполнение без знака) может быть определено с помощью, на языке C / C ++, most-significant-carry-out = (a > 0xFF...FF - b), где 0xFF...FF - соответствующее максимальное значение, а a и b не являются отрицательные значения.

Вычитание может быть уменьшено до сложения. См. Мои ответы на этот вопрос и этот вопрос .

...