Что такое калькулятор дополнительного кода?
Калькулятор дополнительного кода (в англоязычной литературе — two's complement) переводит числа между десятичной, двоичной и шестнадцатеричной системами и наглядно показывает, как отрицательные значения хранятся внутри компьютера. Дополнительный код — это стандартный способ представления знаковых целых чисел практически во всех современных процессорах, поэтому понимать его необходимо программистам, студентам-электронщикам и всем, кто работает с цифровой логикой. С помощью этого инструмента вы можете ввести число в любой системе счисления, выбрать разрядность (8, 16 или 32 бита) и сразу увидеть его представление в дополнительном коде вместе с десятичным значением.
Как пользоваться калькулятором
- Введите число в поле ввода — поддерживаются десятичный, двоичный и шестнадцатеричный форматы.
- При необходимости укажите систему счисления вашего числа.
- Выберите разрядность: 8, 16 или 32 бита.
- Смотрите результат: двоичное, шестнадцатеричное и знаковое десятичное значения появятся автоматически.
Разрядность важна, поскольку именно она задаёт диапазон чисел, которые можно сохранить. Например, 8-битное знаковое целое вмещает значения от −128 до 127, а 16-битное — от −32 768 до 32 767.
Разбор формулы
Чтобы получить дополнительный код двоичного числа, выполните два шага:
- Инвертируйте все биты (замените каждый 0 на 1, а каждую 1 на 0). Так получается обратный код (one's complement).
- Прибавьте 1 к результату.
Самый левый бит играет роль знакового: 0 означает положительное число, 1 — отрицательное. Чтобы перевести отрицательное десятичное число в дополнительный код, используется формула \(2^{n} + \text{значение}\), где n — разрядность.
$$\text{Twos Complement} = \left(\sim \text{Number}_{\,2}\right) + 1 \pmod{2^{\text{Bit Width}}}$$
Разбор примера
Переведём −5 в 8-битный дополнительный код:
- Запишем +5 в двоичном виде:
0000 0101. - Инвертируем биты:
1111 1010. - Прибавим 1:
1111 1011.
Таким образом, −5 хранится как 1111 1011, что соответствует FB в шестнадцатеричной системе. Проверка: \(251 - 256 = -5\) (значение без знака минус 256).
Диапазоны знаковых целых чисел по ширине бита
Дополнение до двух — это стандартный способ представления знаковых целых чисел в компьютерах. Для заданной ширины бита \(n\) один бит действует как знаковый бит, поэтому представимый диапазон знаковых значений составляет \(-2^{n-1}\) до \(2^{n-1}-1\), в то время как беззнаковая интерпретация тех же битов охватывает \(0\) до \(2^{n}-1\). Вся арифметика переполняется по модулю \(2^{n}\).
| Ширина бита \(n\) | Минимум знакового \(-2^{n-1}\) | Максимум знакового \(2^{n-1}-1\) | Максимум беззнакового \(2^{n}-1\) | Модуль \(2^{n}\) |
|---|---|---|---|---|
| 8 | -128 | 127 | 255 | 256 |
| 16 | -32,768 | 32,767 | 65,535 | 65,536 |
| 32 | -2,147,483,648 | 2,147,483,647 | 4,294,967,295 | 4,294,967,296 |
| 64 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | 18,446,744,073,709,551,615 | 18,446,744,073,709,551,616 |
Например, дополнение до двух десятичного числа 5 в 8-битной форме — это 251 при интерпретации как беззнаковый байт, что представляет \(-5\) как знаковое значение.
Справочник "Десятичное–Двоичное–Шестнадцатеричное" для типичных 8-битных значений
Следующая таблица сопоставляет характерные знаковые десятичные значения их 8-битным формам дополнения до двух в двоичной и шестнадцатеричной нотации. Отрицательные числа имеют старший значащий бит, установленный в 1. Для инвертирования значения инвертируйте все 8 битов и добавьте 1.
| Знаковое десятичное число | 8-битное двоичное | Шестнадцатеричное | Беззнаковое значение |
|---|---|---|---|
| -128 | 1000 0000 | 0x80 | 128 |
| -64 | 1100 0000 | 0xC0 | 192 |
| -5 | 1111 1011 | 0xFB | 251 |
| -1 | 1111 1111 | 0xFF | 255 |
| 0 | 0000 0000 | 0x00 | 0 |
| 1 | 0000 0001 | 0x01 | 1 |
| 5 | 0000 0101 | 0x05 | 5 |
| 64 | 0100 0000 | 0x40 | 64 |
| 127 | 0111 1111 | 0x7F | 127 |
Для независимой проверки двоичной формы вы можете преобразовать 8-битный шаблон 11111011 обратно в десятичное число, которое равно 251 как беззнаковый байт (интерпретируется как \(-5\) со знаком).
Ключевые термины и определения
- Ширина бита
- Количество двоичных цифр, используемых для хранения целого числа (обычно 8, 16, 32 или 64). Она определяет модуль \(2^{n}\) и, следовательно, диапазон представимых значений.
- Знаковый бит
- Единственный бит, который указывает, является ли знаковое число отрицательным (1) или неотрицательным (0). В дополнении до двух это старший бит.
- Старший значащий бит (СЗБ)
- Самый левый бит наибольшего значения в двоичном числе. В знаковом значении дополнения до двух СЗБ одновременно выступает как знаковый бит.
- Дополнение до единицы
- Побитовая инверсия числа — каждый 0 становится 1 и каждый 1 становится 0 (\(\overline{B}\)). Это промежуточный шаг перед добавлением 1 для формирования дополнения до двух.
- Дополнение до двух
- Доминирующее кодирование знакового целого числа: инвертируйте все биты и добавьте 1, т.е. \(\overline{B}+1 \pmod{2^{n}}\). Оно дает единственное представление нуля и позволяет одному и тому же оборудованию складывать знаковые и беззнаковые числа.
- Переполнение / переполнение
- Что происходит, когда результат превышает представимый диапазон для ширины бита; значение переполняется по модулю \(2^{n}\). Например, добавление 1 к 8-битному максимуму 127 переполняется до -128.
- Знаковое целое число в сравнении с беззнаковым целым числом
- Знаковое целое число может представлять отрицательные значения, используя дополнение до двух (диапазон \(-2^{n-1}\) до \(2^{n-1}-1\)); беззнаковое целое число обрабатывает каждый битовый шаблон как неотрицательный (диапазон \(0\) до \(2^{n}-1\)). Биты идентичны — отличается только интерпретация.
Часто задаваемые вопросы
Почему компьютеры используют дополнительный код? Он позволяет выполнять сложение и вычитание одной и той же схемой, и у нуля есть только одно представление — в отличие от прямого кода (sign-magnitude) и обратного кода.
Что произойдёт, если число не помещается в выбранную разрядность? Значение переполняется и «закольцовывается», давая неожиданный результат. Чтобы этого избежать, выберите большую разрядность.
Как перевести обратно в обычное десятичное число? Если знаковый бит равен 1, снова возьмите дополнительный код и поставьте знак минус; если он равен 0, читайте число как обычное двоичное.