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