Вычисление абсолютных разностей целых чисел безопасным для переполнения способами?

Я хотел бы вычислить абсолютную разность двух целых чисел. Наивно, это всего лишь абс (а - б) .Однако здесь возникает пара проблем, в зависимости от того, имеют ли целые числа знаковые или беззнаковые:

  • Для целых чисел без знака a - b будет большим положительным числом, если b равно больше, чем a , и операция абсолютного значения этого не исправит.

  • Для целых чисел со знаком a - b может находиться за пределами диапазона значений, которые могут быть представлены как целое число со знаком, что приводит к неопределенному поведению. (Очевидно, это означает, что результатом должно быть целое число без знака.)

Как можно эффективно решить эти проблемы?

Мне нужен алгоритм (или пара алгоритмов), который работает как для подписанных и беззнаковые целые числа, и не полагается на приведение значений к большему целочисленному размеру.

(Также, чтобы уточнить: мой вопрос не в том, как написать это в коде, а в том, что именно я должен писать, чтобы гарантировать безопасность от переполнения. Вычисление abs (a - b) как значение со знаком и последующее приведение к беззнаковому значению не работают, потому что переполнение целого числа со знаком обычно является неопределенной операцией, по крайней мере, в C.)

7
задан Brooks Moses 6 November 2011 в 01:10
поделиться