§ Обычное сравнение

Еще одной загадкой Бытия для меня стала теория о знаковых сравнениях в процессоре. Даже не буду говорить, сколько лет я не задумывался над этой проблемой и даже не пытался её решить. Сегодня я задумался и попробовал понять, что не так то, почему не получается решить? Разбираясь с проблемой, нашел ей математическое оправдание.
Сравнить беззнаковые числа довольно просто, нужно вычесть число A из числа B, и если будет перенос - то значит, число A меньше чем B (потому что перенос был). Но вот со знаковыми числами такое не пройдет, и вот почему. Допустим, надо сравнить число -1 и число 2. Число -1 в процессоре представлено в виде 111111118 (если брать байт), а число 2 - в виде 000000108. Вычитая -1 из 2, никакого переноса не получается: 0xFFFF - 0x0002, поскольку тут его не может быть никак. А как же тогда быть?
И тут на помощь приходит математика. Нам что нужно? Нужно сравнить A >= B. Для начала, я представлю это так: A \geq B , и вычту из обеих частей уравнения (из левой и правой) число B: A-B \geq 0
Значит, вычитая A - B, и получая положительное число, это будет означать только одно, что число A больше или равно числу B. Можно попробовать поупражняться на небольших числах. Но именно на небольших, потому что там есть такой неприятный момент, что когда получается переполнение, все меняется.
(-2) - (-1) = -1, число отрицательное, значит -2 < -1
(-4) - (+3) = -7, число -4 явно меньше +3
(-5) - (-6) = +1, число -5 >= -6, и это правда

§ Переполнение

А что будет, если вдруг при вычитании числа у нас появилось переполнение? К примеру -127 - (+64) = -191. Два этих числа представлены в 8-битном виде: 0x81 - 0x40 = 0x41. Как можно заметить, на самом деле получилось тут НЕ отрицательное число и вообще непонятно какое число (число 65).
В таких случаях, появляется переполнение, которое сигнализирует о том, что знак поменялся, то есть, знак противоположный от того, что должен быть. Это значит, что как только появляется переполнение, то надо просто менять знак и проверять по нему.

§ Вывод

Итак, получается, что:
  • Если V=0, то A >= B, тогда, когда S=0 (положительное)
  • Если V=1, то A >= B, когда S=1 (отрицательное)
Чтобы определить, что число A больше или равно чем B, нужно, чтобы V было равно S. Если V=0,S=0 или V=1,S=1. Если условие не совпадает, то тогда V != S.
Вот и всё!