Почему «знак и модуль» не подходит
Очевидный способ представить отрицательное число — выделить один бит под знак, а остальные под модуль. Но такая схема даёт два разных представления нуля (+0 и −0) и заставляет сумматор сначала анализировать знаковые биты, прежде чем решить, складывать или вычитать. Цифровому оборудованию нужно представление, при котором обычное сложение работает всегда, независимо от знака.
Дополнительный код
Дополнительный код решает эту проблему: чтобы получить отрицательное число из N-битного, нужно инвертировать все биты и прибавить 1. Для 4 бит это даёт диапазон от −8 до +7, с единственным представлением нуля.
- Пример: +3 — это 0011. Инвертируем и получаем 1100, прибавляем 1: 1101 — это −3.
- Старший бит по-прежнему ведёт себя как знаковый (0 — не отрицательное, 1 — отрицательное), но обычное двоичное сложение чисел в дополнительном коде автоматически даёт верный результат, вместе со всеми переносами.
Вычитание как сложение
Поскольку отрицание — это просто «инвертировать и прибавить 1», A − B превращается в A + (¬B) + 1 — ровно цепочка полных сумматоров с инвертированными битами B и начальным переносом, зафиксированным в 1 вместо 0. Именно поэтому в реальных АЛУ почти никогда нет отдельной схемы вычитания: то же самое сумматорное оборудование обслуживает обе операции, переключаемые одним управляющим сигналом, который инвертирует (через XOR) каждый бит B и подаётся на начальный перенос.
Попробуйте в Boolflow
Соберите 4-битный сумматор в редакторе схем, поставьте перед каждым входом B вентиль XOR с общей управляющей линией и подайте ту же линию на первый перенос. Переключайте управляющую линию и с помощью инструмента «Таблица истинности» убедитесь, что при 0 схема считает A+B, а при 1 — A−B.