Дополнительный код
Дополнительный код (англ. two’s complement) — это способ представления целых чисел со знаком в двоичной системе счисления, наиболее распространённый в современных компьютерах и цифровых устройствах. Он позволяет выполнять арифметические операции сложения и вычитания с использованием единого алгоритма, не требуя отдельной обработки знака числа. В дополнительном коде старший бит числа выполняет роль знакового разряда: 0 соответствует положительному числу, 1 — отрицательному.
История
Дополнительный код был разработан в середине XX века для упрощения конструкции арифметико-логических устройств (АЛУ) компьютеров. Ранние вычислительные машины, такие как ENIAC (1945 год), использовали прямой код для представления чисел, что требовало отдельных схем для сложения и вычитания. В 1940-х годах Джон фон Нейман предложил использовать дополнительный код в архитектуре EDVAC, чтобы унифицировать арифметические операции.
Первым коммерческим компьютером, реализовавшим дополнительный код, стал IBM 704 (1954 год). С тех пор этот метод стал стандартом для большинства процессоров, включая архитектуры x86, ARM, RISC-V и другие. В 1960-х годах дополнительный код был включён в систему команд PDP-8, а затем и в микропроцессоры Intel 4004 (1971 год).
Принцип работы
Представление чисел
В дополнительном коде числа записываются в двоичной системе с фиксированной разрядностью (например, 8, 16, 32 или 64 бита). Для положительных чисел дополнительный код совпадает с прямым кодом: старший бит равен 0, остальные биты содержат модуль числа. Для отрицательных чисел алгоритм преобразования состоит из двух шагов:
- Взять модуль числа в двоичном виде (прямой код).
- Инвертировать все биты (получить обратный код).
- Прибавить 1 к полученному значению.
Например, для 8-битного представления числа −5:
- Прямой код числа 5: 00000101.
- Инвертирование: 11111010.
- Прибавление 1: 11111011 (дополнительный код числа −5).
Диапазон значений
Для n-битного представления в дополнительном коде диапазон возможных значений составляет от −2^(n−1) до 2^(n−1) − 1. Например:
- Для 8 бит: от −128 до 127.
- Для 16 бит: от −32768 до 32767.
- Для 32 бит: от −2147483648 до 2147483647.
Особенностью является асимметрия: количество отрицательных чисел на единицу больше, чем положительных, из-за того, что ноль имеет единственное представление (все биты равны 0). Минимальное отрицательное число (например, −128 для 8 бит) не имеет положительного аналога в том же диапазоне.
Арифметические операции
Сложение и вычитание в дополнительном коде выполняются по единому алгоритму: числа складываются как беззнаковые двоичные числа, а знак результата определяется автоматически. Если результат выходит за пределы диапазона, возникает переполнение (overflow), которое обнаруживается по несовпадению знакового бита результата со знаковыми битами операндов.
Вычитание реализуется как сложение с дополнительным кодом вычитаемого. Например, 5 − 3 = 5 + (−3):
- 5: 00000101.
- −3: 11111101.
- Сложение: 00000101 + 11111101 = 1 00000010 (старший бит отбрасывается, результат 2).
Умножение и деление выполняются с использованием дополнительного кода, но требуют дополнительных алгоритмов, таких как умножение Бута.
Сравнение с другими кодами
Прямой код
В прямом коде знак числа указывается отдельным битом (0 для плюса, 1 для минуса), а модуль записывается в двоичной форме. Недостатки:
- Ноль имеет два представления (00000000 и 10000000), что усложняет арифметику.
- Вычитание требует отдельных схем для заема.
Обратный код
Обратный код (англ. one’s complement) получается инвертированием всех бит прямого кода. Недостатки:
- Ноль также имеет два представления (00000000 и 11111111).
- При сложении требуется циклический перенос (end-around carry), что замедляет вычисления.
Дополнительный код лишён этих недостатков: ноль единственен, а сложение и вычитание выполняются одинаково.
Применение
Процессоры и микроконтроллеры
Дополнительный код используется во всех современных процессорах для представления целых чисел со знаком. Например, в архитектуре x86 команды ADD и SUB работают с числами в дополнительном коде. В микроконтроллерах, таких как AVR или ARM Cortex-M, арифметические операции также основаны на этом методе.
Языки программирования
В языках программирования, таких как C, C++, Java и Python, целые числа со знаком (типы int, short, long) хранятся в дополнительном коде. Стандарт C99 (ISO/IEC 9899:1999) явно разрешает дополнительный код как один из вариантов, а начиная с C23 (ISO/IEC 9899:2023) он стал единственным обязательным представлением для знаковых целых.
Цифровая обработка сигналов
В цифровых сигнальных процессорах (DSP) дополнительный код используется для обработки аудио- и видеоданных, где требуется высокая точность арифметических операций.
Интересные факты
- В дополнительном коде минимальное отрицательное число (например, −128 для 8 бит) при инвертировании и прибавлении 1 даёт само себя, что является математическим курьёзом.
- Некоторые ранние компьютеры, такие как IBM 7090, использовали обратный код, но позже перешли на дополнительный из-за его эффективности.
- В языке программирования Java все целые типы (
byte,short,int,long) используют дополнительный код, что гарантирует переносимость между платформами.
Критика
Несмотря на широкое распространение, дополнительный код имеет ограничения:
- Асимметрия диапазона (например, −128 представимо, а +128 — нет) может приводить к ошибкам при переполнении.
- Умножение и деление в дополнительном коде требуют более сложных алгоритмов, чем в прямом коде.
- Для чисел с плавающей запятой используется отдельный стандарт IEEE 754, не связанный с дополнительным кодом.
Источники
- Таненбаум Э. Архитектура компьютера. — 6-е изд. — СПб.: Питер, 2013. — 816 с.
- Паттерсон Д., Хеннесси Дж. Архитектура компьютера и проектирование компьютерных систем. — 5-е изд. — М.: Вильямс, 2018. — 1056 с.
- ISO/IEC 9899:2023. Information technology — Programming languages — C. — 2023.
- Intel 64 and IA-32 Architectures Software Developer’s Manual. — Vol. 1. — Intel Corporation, 2023.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →