Вычитание, сравнение и АЛУ

Как сумматор превращается в вычитатель, почему сравнение чисел — это вычитание, что такое флаги и как устроено арифметико-логическое устройство процессора. С разбором примеров на четырёх битах.

Содержание

АЛУ, арифметико-логическое устройство, — это часть процессора, которая выполняет вычисления: складывает, вычитает и сравнивает числа, применяет к ним логические операции. Отдельной схемы для вычитания в нём нет. Вычитает и сравнивает тот же сумматор, к которому добавили несколько вентилей.

Вычитание без вычитателя

В игре меню выбора героя замкнуто в кольцо: шестнадцать портретов стоят по кругу. Нужный портрет на шесть мест левее. Можно шесть раз нажать «влево». А можно десять раз нажать «вправо»: круг замкнётся, и Вы окажетесь там же. Шаг назад на 6 и шаг вперёд на 10 дают одно и то же, потому что 6 + 10 = 16.

Четыре бита — такой же круг из шестнадцати значений: после 1111 снова идёт 0000. Значит, вместо того чтобы вычитать B, можно прибавить число, которое дополняет B до 16. В уроке Целые числа в памяти оно называлось дополнительным кодом числа −B. Получают его так: инвертируют все биты B и прибавляют единицу. Отсюда главное правило урока:

TXT
A − B = A + (инверсия B) + 1

Почему правило работает? Сложите любое четырёхразрядное число с его инверсией. В каждом разряде встретятся ноль и единица, и получится 1111, то есть 15. Значит, инверсия B равна 15 − B:

TXT
A + (15 − B) + 1 = A − B + 16

Лишние 16 — это единица в пятом разряде. В четыре бита она не помещается и отбрасывается. Остаётся A − B.

Пример: 13 − 6

TXT
A             1101    13
B             0110     6
инверсия B    1001     9

    1101
  + 1001
  +    1
  ------
  1 0111

Проверим в десятичной записи: 13 + 9 + 1 = 23 = 16 + 7. Пятая цифра уходит на выход переноса из старшего разряда, а на четырёх выходах суммы остаётся 0111 — это 7. Верно: 13 − 6 = 7.

При сложении перенос из старшего разряда означал переполнение. При вычитании чисел без знака всё наоборот: единица на этом выходе говорит, что A не меньше B и ответ правильный.

Сумматор с переключателем режима

Чтобы одна схема умела и складывать, и вычитать, она должна по команде делать две вещи: инвертировать B и прибавлять единицу.

Инвертировать по команде умеет исключающее ИЛИ. Подадим на один его вход бит B, а на другой — управляющий сигнал M:

BMВыход
000
101
011
110

Пока M = 0, бит проходит без изменений. Когда M = 1, на выходе его инверсия. Так работает переключатель «Инверсия цветов» в настройках телефона: выключен — картинка обычная, включён — каждый цвет заменён противоположным.

Прибавить единицу ещё проще. У сумматора младшего разряда есть входной перенос, на который до сих пор подавали 0. Подключим к нему тот же сигнал M.

Биты B проходят через четыре вентиля исключающее ИЛИ и попадают в четырёхразрядный сумматор; управляющий сигнал M подан на вторые входы вентилей и на входной перенос сумматора
Рисунок 1 — Сумматор-вычитатель: сигнал M инвертирует биты B и одновременно прибавляет единицу
  • M = 0: биты B не меняются, входной перенос равен 0. Схема считает A + B.
  • M = 1: биты B инвертированы, входной перенос равен 1. Схема считает A + (инверсия B) + 1, то есть A − B.

Вычитание обошлось в четыре дополнительных вентиля — по одному на разряд.

Сравнение — это вычитание

Покупая предмет в игре, Вы заставляете программу проверить, хватает ли монет. Набирая код домофона — проверить, совпал ли он с правильным. Для процессора оба вопроса решаются вычитанием: он считает A − B и смотрит не на само число, а на его признаки.

Такие признаки называют флагами. Флаг — это один бит, который сообщает что-то о результате. Нам хватит двух:

  • флаг нуля Z (от английского zero) равен 1, когда все биты результата — нули. Его получают, собрав все биты результата на вентили ИЛИ и поставив в конце НЕ;
  • флаг знака N (от negative) — это старший бит результата. В дополнительном коде единица в старшем разряде означает отрицательное число.

Сравним три пары чисел на четырёх битах:

A − BРезультатZNВывод
5 − 5000010числа равны
6 − 3001100A больше B
3 − 5111001A меньше B

В последней строке 1110 — это −2 в дополнительном коде.

АЛУ: все операции в одном блоке

Сложение, вычитание, логические операции над парами битов собирают в один блок — арифметико-логическое устройство. У него есть:

  • два входа для чисел A и B;
  • вход кода операции — несколько битов, которые говорят, что нужно сделать;
  • выход результата;
  • выходы флагов.

Возьмём учебное АЛУ на четыре операции. Коду операции хватит двух битов. Коды мы назначили сами: у каждого настоящего процессора они свои.

Код операцииДействиеРезультат для A = 1100, B = 1010
00A + B0110 и перенос 1
01A − B0010
10A И B1000
11A ИЛИ B1110

Самое любопытное — как АЛУ выбирает операцию. Оно ничего не выбирает заранее: все схемы внутри работают одновременно, и каждая выдаёт свой ответ. На выход проходит только один — тот, на который указывает код операции. Схему, которая пропускает на выход один вход из нескольких, называют мультиплексором.

Похоже на прямую трансляцию матча: все камеры снимают одновременно, а режиссёр кнопкой решает, какая картинка идёт в эфир.

Числа A и B поступают сразу на четыре схемы: сложение, вычитание, И, ИЛИ; блок выбора по коду операции 01 пропускает на выход результат вычитания; по результату выставляются флаги Z и N
Рисунок 2 — АЛУ считает все операции сразу, а код операции выбирает, какой результат попадёт на выход

На рисунке сложение и вычитание показаны отдельными блоками, чтобы было нагляднее. На деле их выполняет один сумматор-вычитатель. Заметьте: коды 00 и 01 различаются только правым битом, и его можно подать прямо на вход M.

Умножение: сдвиги и сложения

Допишите к десятичному числу ноль справа — оно вырастет в 10 раз. В двоичной системе такой же ноль увеличивает число в 2 раза: 110 — это 6, 1100 — 12, 11000 — 24. Операцию, при которой все биты переезжают на разряд левее, называют сдвигом влево.

Умножим 6 на 5. Множитель 5 — это 101₂, то есть 4 + 1. Значит, 6 · 5 = 6 · 4 + 6 · 1:

TXT
6 · 1     00110     6
6 · 4     11000    24    сдвиг влево на два разряда
          -----
сумма     11110    30

Умножение свелось к сдвигам и сложениям: для каждой единицы в записи множителя берём сдвинутое первое число и складываем всё вместе. Настоящие процессоры умножают более быстрыми схемами, но идея у них та же.

Частые ошибки

  • Забывают прибавить единицу. Одна инверсия даёт ответ на единицу меньше: 13 + 9 = 22, на четырёх битах это 0110, то есть 6 вместо 7.
  • Считают перенос при вычитании ошибкой. Единица на выходе переноса здесь означает, что уменьшаемое не меньше вычитаемого.
  • Думают, что АЛУ сначала выбирает операцию, а потом считает. Считается всё сразу, выбирается готовый результат.
  • Дописывают ноль не с той стороны. Ноль слева число не меняет, ноль справа — удваивает.

Коротко

  • Вычитание заменяют сложением: A − B = A + (инверсия B) + 1.
  • Вентили исключающего ИЛИ инвертируют B по управляющему сигналу; тот же сигнал подают на входной перенос.
  • Сравнить два числа — значит вычесть их и посмотреть на флаги: Z сообщает, что результат равен нулю, N — что он отрицательный.
  • АЛУ — блок с двумя входами для чисел, кодом операции, выходом результата и флагами.
  • Все операции АЛУ считает одновременно, а нужный результат выбирает мультиплексор.
  • Сдвиг влево умножает число на 2; умножение складывается из сдвигов и сложений.

АЛУ считает, но ничего не помнит: уберите числа со входов — исчезнет и результат. Как схема запоминает один бит — в уроке Триггер.

Использованная литература

  1. Арифметико-логическое устройство — Википедия [Электронный ресурс]. — URL: https://ru.wikipedia.org/wiki/Арифметико-логическое_устройство (дата обращения: 09.10.2026).
  2. Дополнительный код — Википедия [Электронный ресурс]. — URL: https://ru.wikipedia.org/wiki/Дополнительный_код (дата обращения: 09.10.2026).
  3. Adder–subtractor — Wikipedia [Электронный ресурс]. — URL: https://en.wikipedia.org/wiki/Adder%E2%80%93subtractor (дата обращения: 09.10.2026).
  4. Мультиплексор (электроника) — Википедия [Электронный ресурс]. — URL: https://ru.wikipedia.org/wiki/Мультиплексор_(электроника) (дата обращения: 09.10.2026).