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