Отрицательные числа в двоичной системе: знаковый модуль, дополнение и дважды дополнительный код
Вычитание можно превратить в сложение, рассматривая вычитаемое как отрицательное: 7 − 5 становится 7 + (−5).
Освоив представление положительных чисел, следующим шагом кодируем отрицательные, чтобы вычитание выполнялось той же процедурой сложения.
В десятичной системе знак минус ставится перед старшим разрядом (например, −5). В двоичном железе только два состояния — высокий или низкий — поэтому знак нужно закодировать в самой битовой последовательности.
У нас нет третьего символа «минус». Одно решение — выделить бит для математического знака:
Использование бит не по их позиционному весу может вводить в заблуждение: 1101₂ можно прочесть как тринадцать, если не считать старший бит знаковым.
Сначала определим общую разрядность для размещения максимального модуля, затем обеспечим, чтобы все операции оставались в этой ширине.
В примере ниже диапазон ограничен −7 (1111₂) … +7 (0111₂), рассматривая старший бит как знаковый, предотвращая ложную интерпретацию.
Кодирование −5 как 1101₂ иллюстрирует систему знаковый-модуль, где старший бит обозначает знак, а не значение, жертвуя позиционной чистотой ради практичности.
Старший бит показывает знак; остальные биты сохраняют стандартные позиционные веса (степени двойки).
Дополнение
Хотя знаковый-модуль понятен концептуально, он усложняет двоичное сложение. Как прибавить −5 (1101₂) к другому числу обычным сложением?
Создание специального алгоритма сложения упускает суть — это равносильно столбиковому вычитанию, теряя вычислительную выгоду.
Альтернатива — дополнение — позволяет складывать отрицательные числа стандартным двоичным сложением и естественно согласуется с позиционными весами.
В этой схеме старший бит всё ещё ограничивает диапазон, но теперь имеет отрицательный вес (например, −8). Например, −5 кодируется так:
С тремя правыми битами для модулей 0–7 и левым битом 0 или −8 можно представить любое целое от −7 (1001₂ = −8 + 1 = −7) до +7 (0111₂ = 0 + 7 = 7).
Положительные значения неизменны, но отрицательные требуют операции дополнения.
Отрицательные числа в правом столбце — сумма трёх правых бит и отрицательного веса левого (−8), поэтому их прогрессия не совпадает с положительной.
Три правых бита должны быть установлены так, чтобы в сумме с −8 дать нужное отрицательное значение.
Дважды дополнительный код (Two's Complement)
Три правых бита — это дважды дополнительный код положительного аналога. Например:
С битом отрицательного веса как четвёртым (−8), дважды дополнительный код для любого положительного числа — это значение, которое нужно прибавить к −8, чтобы получить отрицательный эквивалент.
Вычисление двухкратного дополнения просто: инвертировать все биты (однократное дополнение) и прибавить единицу. Для пяти (101₂) инвертируем в 010₂, прибавляем 1 → 011₂, что есть −5 в трёхбитном двухкратном дополнении.
Генерация работает так же, если манипулировать всеми битами, включая знаковый. Пример: 0101₂ (пять) в отрицательную пятую:
Инвертировать все → 1010₂; прибавить 1 → 1011₂, что есть −5 в четырёхбитном двухкратном дополнении.
Критично зафиксировать позицию бита отрицательного веса до преобразования. Если восьмой бит — знаковый (10000000₂), двухкратное дополнение 0000101₂ будет 1111011₂, представляя −5 в восьмибитном формате.
Таким образом, в 8-битной системе +5 = 00000101₂, а −5 = 11111011₂.
СВЯЗАННЫЕ РАБОЧИЕ ЛИСТЫ:
- Рабочий лист по двоичной математике
Промышленные технологии
- 3-битный двоичный счетчик на таймере 555 и триггерах 4027
- Восьмеричная и шестнадцатеричная системы: практическое руководство для инженеров
- Числа и системы счисления: понимание различия и его практическое значение
- Двоичное вычитание с использованием двухкратного дополнения
- Понимание отрицательной обратной связи в ОУ: повторители напряжения и стабильность
- Освоение алгоритмов Java Collections: сортировка, перемешивание и многое другое
- Работа с числовыми типами в C++: практическое руководство
- Числа в MATLAB: типы, хранение и преобразование
- Числа в Python: Неизменяемые числовые типы данных
- Создание первого Go-приложения на PLCnext: руководство для начинающих