Электроника:Цифровая электроника/Двоичная арифметика/Отрицательные двоичные числа

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Макаров В. (valemak) Контакты:</br>* Habr: @vakemak</br>* Сайт: www.valemak.com</br>Перевёл статей: 648.
Проверка/Оформление/Редактирование: Мякишев Е.А.


Отрицательные двоичные числа[1]

Поскольку со сложением всё ясно-понятно, мы можем выполнять операцию вычитания с помощью той же самой техники, просто сделав одно из чисел отрицательным. Например, если нам нужно выполнить вычитания 7 – 5 («от семи вычитаем пять») то, по своей сути, мы это сводим к сложению 7 + (-5) («к семи прибавляем минус пять»).

Поскольку мы уже знаем, как представлять положительные числа в двоичном формате, всё, что нам нужно выяснить сейчас, это как представлять их отрицательные значения, после чего мы сможем легко выполнять вычитание.

Обычно мы представляем отрицательное десятеричное число, указывая знак «минус» непосредственно слева от самой значащей цифры, как в примере выше (-5). Однако мы потому и используем двоичную систему счисления при создании схем включения/выключения, так как битовые значения можно представлять в терминах напряжения (где всего 2 альтернативных значения: либо более «высокое» значение напряжения, либо более «низкое»).

В этом контексте (всего два возможных значения) мы не можем позволить себе роскошь в виде ещё одного, третьего, символа, такого как знак «минус», поскольку электрические цепи могут быть или включены или выключены (у нас только два возможных состояния). Одно из возможных решений – зарезервировать один бит (в схеме), который ничего не делает, кроме того, что он представляет математический знак (этот специальный бит только обозначает «плюс» или «минус»):

1012 = 510

Это положительное десятеричное число 5 в двоичной системе счисления. Добавим в начало дополнительный бит (будем его называть экстрабит), который будет указывать на знак, «плюс» или «минус».

01012 = 510 (положительное число)

Первый бит (экстрабит), равный 0, указывает только на то, что это положительное число. Второй, третий и четвёртый биты – это число «5» в двоичной системе счисления.

11012 = 510 (отрицательное число)

Экстрабит (самый первый бит), равный 1, указывает только на то, что это отрицательное число. Второй, третий и четвёртый биты – это число «5» в двоичной системе счисления. Как вы понимаете, нужно проявлять повышенную осторожность, когда используем дополнительные биты для каких-либо иных целей, помимо указания стандартных разрядов числа, имеющих «вес» в зависимости от позиции. В противном случае 11012 может быть неверно истолковано как число «тринадцать», хотя на самом деле мы имели в виду отрицательную пятёрку.

Чтобы не усложнять здесь задачу, мы должны сначала договориться, сколько битов нам понадобится для представления наибольших чисел, с которыми мы будем планируем иметь дело, а затем убедиться, что их побитовая длина не превышает количество полей, предусмотренных при проведении наших арифметических операций.

В приведённом выше примере я ограничился представлением чисел от отрицательной семёрки (11112) до положительной семёрки (01112) и только в этом диапазоне, зарезервировав четвёртый бит исключительно для обозначения «знака». Только предварительно установив эти пределы, я смогу избежать ситуаций, когда отрицательное число могло бы быть перепутано с бо́льшим положительным числом.

Представление отрицательной пятерки как 11012 является примером использования системы «знак-величина» для отрицательных чисел в двоичной системе счисления. Используя крайний левый экстрабит в качестве индикатора знака, а не взвешенного значения самого старшего разряда, я жертвую «чистой» формой двоичной записи ради чего-то, что даёт мне практическое преимущество: представления отрицательных чисел.

Крайний левый бит читается только как знак, положительный или отрицательный, а уже все остальные биты интерпретируются в соответствии со стандартной двоичной записью: слева-направо, это веса́, кратные двум.

Дополнение

Каким бы простым ни был подход «знак-величина», он не шибко удобен для арифметических манипуляций. Например, как мне добавить отрицательную пятёрку (11012) к любому другому числу, используя стандартную технику двоичного сложения?

Мне пришлось бы изобрести новый способ выполнения сложения, чтобы оно сработало, и если я так сделаю, то с таким же успехом я мог бы просто произвести вычитание от руки; нет никакого арифметического преимущества в использовании отрицательных чисел для выполнения вычитания путём сложения, если мы должны делать это со знаковой нумерацией, и ведь именно это (упрощение процесса) и было нашей целью!

Есть ещё один метод представления отрицательных чисел, который работает с нашей знакомой техникой ручного сложения, а также имеет больше смысла с точки зрения взвешенно-позиционной записи числа. Этот способ – так называемое дополнение.

С помощью этой стратегии мы вновь используем крайний левый экстрабит для определённой цели, как мы это делали с подходом «знак-величина». Как и тогда, фиксируем количество битов, дабы определить максимальный и минимальный пределы чисел, наш рабочий диапазон. Однако на этот раз крайний левый экстрабит - это нечто большее, чем просто резервация для обозначения знака; можно сказать, что он обладает отрицательной числовой массой. Например, значение отрицательных пяти будет представлено вот так:

10112 = -510

Самый первый (крайний слева) бит определяет т.н. отрицательную массу числа. В данном случае – отрицательную восьмёрку. Для обозначения самой величины числа мы используем 3 бита (максимальное значение = 710), а бинарное восемь = 10002.

Т.е. самый первый бит – это -810, остальные биты подобраны так, чтобы при сложении их с отрицательной восьмёркой получилось -510:

(1 × -810) + (0 × 410) + (1 × 210) + (1 × 110) = -810 + 310 = -510

Итак, ещё раз. Три правых бита могут представлять величину от нуля до семи, а крайний левый экстрабит представляет либо ноль (если бит равен 0), либо отрицательную восьмёрку (если бит равен 1). Таким макаром мы можем успешно представить любое целое число в диапазоне от отрицательной семёрки (10012 = -810 + 110 = -710) до положительной семёрки (01112 = 010 + 710 = 710).

Представление положительных чисел в этой схеме (с четвёртым битом, т.е экстрабитом, обозначающим отрицательный вес) ничем не отличается от обычного двоичного представления. Однако представить отрицательные числа – не такая тривиальная задача:

ноль 0000
положительное «один» 0001 отрицательное «один» 1111
положительное «два» 0010 отрицательное «два» 1110
положительное «три» 0011 отрицательное «три» 1101
положительное «четыре» 0100 отрицательное «четыре» 1100
положительное «пять» 0101 отрицательное «пять» 1011
положительное «шесть» 0110 отрицательное «шесть» 1010
положительное «семь» 0111 отрицательное «семь» 1001
отрицательное «восемь» 1000

Обратите внимание, что отрицательные двоичные числа в правом столбце, являющиеся суммой общих трёх правых битов плюс отрицательные восемь крайнего левого экстрабита. Эти числа не следуют той же закономерности, что положительные двоичные числа в левом столбце.

Скорее правые три бита должны быть установлены на правильное положительное значение, чтобы равняться желаемой (отрицательной) сумме при суммировании с отрицательным восьмиразрядным значением крайнего левого экстрабита.

Дополнение до двух

Эта группа правых битов (без учёта самого левого бита для указания знака и отрицательной массы числа) – это так называемое дополнение до двух для соответствующего положительного числа. Рассмотрим следующее сравнение:

Положительное число Дополнение до двух
001 111
010 110
011 101
100 100
101 011
110 010
111 001

В данном случае (когда для величин чисел мы используем три бита), когда бит отрицательного веса является четвёртым битом (разрядное значение отрицательной восьмёрки), дополнение до двух для любого положительного числа – это то значение, которое необходимо добавить к отрицательной восьмёрке, чтобы искомое положительное значение преобразовать в его отрицательный эквивалент.

На наше счастье, есть простой способ найти дополнение до двух для любого двоичного числа: нужно просто инвертировать все биты этого числа, заменив все единицы на нули и наоборот (тогда мы получаем то, что называется дополнением до единицы), а затем получившееся двоичное число просто ещё сложить с единицей! Ну, например, чтобы получить дополнение до двух для пятёрки (510 = 1012), мы сначала в двоичном представлении инвертируем все биты (получаем 0102, это у нас «дополнение до единицы») и затем прибавляем ещё единицу: т.е. 0102 + 0012 = 0112, а это как раз то дополнение до двух, позволяющее получить -510 в трёхбитном формате с четвёртым знаковым экстрабитом.

Интересно, что этот способ генерации дополнения до двух для двоичного числа также корректно работает, если вы манипулируете всеми битами, включая самый левый (знаковый) экстрабит, одновременно с битами для указания величины. Давайте сделаем на том же примере, преобразовав положительную пятёрку в отрицательную пятёрку, но выполнив процесс дополнения не для трёх, а для всех четырёх битов.

Мы обязательно включаем знаковый бит 0 (указывающий что начальное число положительные) в исходной пятёрке (510 = 01012). Инвертируем все биты, получив таким образом дополнение до единицы: 10102. Затем, добавляем единицу и получаем окончательный ответ: 10102 + 00012 = 10112. Это наше -510, выраженное в четырёхбитовой формате с дополнением до двух.

Критически важно всегда помнить, что место бита отрицательного веса должно быть уже определено до того, как будут выполнены любые преобразования с дополнением до двух. Если бы наше поле двоичной нумерации было таким, что не четвёртый, а, к примеру, восьмой экстрабит предназначен для обозначения отрицательного веса (таким образом, 100000002 = -12810), нам пришлось бы определять дополнение до двух на основе всех семи оставшихся битов слева.

В этом конкретном случае дополнение до двух для пятёрки (510 = 00001012) будет 11110112. Положительная пятёрка в этой системе будет представлена как 000001012, а отрицательная пятёрка – как 111110112.

См.также

Внешние ссылки