Что такое калькулятор дополнительного кода?
Дополнительный код (англ. two's complement) — это стандартный способ, которым компьютеры хранят целые числа со знаком в фиксированном числе бит. Этот калькулятор берёт десятичное число и заданную разрядность регистра в n бит, после чего показывает, как именно это значение хранится в виде битового шаблона дополнительного кода, какое беззнаковое значение соответствует этим битам и как те же биты трактуются как число со знаком. Калькулятор работает как с положительными, так и с отрицательными числами.
Как пользоваться
Введите десятичное значение, которое нужно закодировать, и количество бит (чаще всего это 8, 16 или 32). Калькулятор «укладывает» число в регистр из n бит с помощью арифметики по модулю, выводит двоичное представление и расшифровывает его как число со знаком. Отрицательные значения автоматически записываются в форме дополнительного кода.
Разбор формулы
Чтобы записать значение \(x\) в \(n\) бит, хранимый (беззнаковый) шаблон вычисляется так:
$$\text{stored} = \left(\left(x \bmod 2^{n}\right) + 2^{n}\right) \bmod 2^{n}$$Дополнительный код (отрицание) от хранимого значения равен \(\text{twos} = \left(2^{n} - \text{stored}\right) \bmod 2^{n}\). Чтобы понять знаковый смысл \(n\)-битного шаблона: если шаблон не меньше \(2^{n-1}\), то значение равно \(\text{pattern} - 2^{n}\) (то есть отрицательное), в противном случае это сам шаблон.
Пример с расчётом
Закодируем \(-5\) в 8 битах. Здесь \(2^{8} = 256\), поэтому
$$\text{stored} = \left(\left(-5 \bmod 256\right) + 256\right) \bmod 256 = 251$$В двоичном виде \(251 = 11111011\). Расшифруем 251: так как \(251 \ge 2^{7}\ (128)\), знаковое значение равно \(251 - 256 = -5\). Дополнительный код от 251 равен \(\left(256 - 251\right) \bmod 256 = 5\), что совпадает по модулю.
Частые вопросы
Почему отрицательные числа выглядят как длинные двоичные шаблоны? Старшие биты заполнены единицами; в знаковой \(n\)-битной арифметике ведущая единица означает отрицательное число, поэтому 11111011 — это \(-5\), а не 251.
Какой диапазон помещается в \(n\) бит? Знаковые значения охватывают диапазон от \(-2^{n-1}\) до \(2^{n-1} - 1\). Для 8 бит это от \(-128\) до 127.
А если число слишком велико? Значения, выходящие за пределы регистра, «зацикливаются» (переполнение) благодаря операции по модулю — точно так же, как это происходит в реальном железе.