Здавалка
Главная | Обратная связь

Способы получения дополнительных кодов целых чисел



1.

1.1.

1.

2.

2.1.

2.2.

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

1) Прямой код записывается в выбранное поле длиной 1, 2 или 4 байта.

2) Прямой код инвертируется (обращается), то есть каждая цифра 0 кода заменя­ется цифрой 1, и наоборот, каждая цифра 1 кода заменяется цифрой 0. Заме­тим, что полученный таким образом код называется обратным, с дополнени­ем до единицы или с поразрядным дополнением.К обратному коду прибав­ляется единица.

Важным моментом в получении правильного конечного результата является первоначальная запись кода в поле подходящей длины. Возьмем, например, пря­мой код 1002. Его инвертирование дает обратный код 0112, а последующее добав­ление единицы — дополнительный 1002. Совпадение прямого и дополнительного кодов свидетельствует об ошибке, так как в данном случае однозначность коди­рования является одним из основных предъявляемых к коду требований. Ошиб­ка состоит в том, что сделана попытка работать с несоответствующим значению числа количеством битов. В самом деле, прямой код 1002 числа 4 занимает N = 3 бита. Но, как следует из вышеизложенного, обсуждаемым способом в этом количестве битов можно представить коды чисел только из диапазона от -4 до +3. Для получения правильного результата необходимо взять хотя бы 4 бита. Тогда получится правильный результат: прямой код 01002, обратный - 10112, а дополнительный — 11002. Итак, при выборе длины поля для записи кода числа необходимо учитывать приведенные в табл. 2.4 соответствия между длиной поля и диапазоном представимых в нем чисел.

Отметим, что если используется прямой код числа, модуль которого принадле­жит допустимому для данного поля диапазону, то в знаковом (крайнем слева) бите обязательно находится 0 (этого не было у кода 1002!). Тогда переход к до­полнительному коду автоматически приведет к формированию в знаковом бите нужной единицы.

Второй способ удобно применять и для двоичных, и для шестнадцатеричных ко­дов. Для получения дополнительного кода нужно прямой код вычесть из числа М =2ᴺ, где N — длина используемого поля в битах. Пусть, например,N=8, прямой код равен 100 11012, его вычитание из 2⁸=1 0000 00002 дает в результате 1011 00112. Очевидно, что, работая в шестнадцатеричной системе счисления, можно получить тот же результат, но в значительно более компакт­ном виде: вычитая прямой код 4В16 из 10016, получаем тот же дополнитель­ный код в виде В316.

1.

2.

2.1.

2.2.

2.2.1.

Получение знакового кода заданного числа

2.

2.1.

2.2.

2.2.1.

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

1) перевести модуль этого числа в двоичную систему счисления;

2) по табл. 2.4 выбрать поле, длина которого обеспечивает возможность записи знакового кода рассматриваемого числа;

3) если число положительное, записать полученный код в выбранное поле.

4) если число отрицательное, получить в выбранном поле его дополнительный код.

Пусть, например, задано число +7710. Перевод модуля этого числа в двоичную систему счисления дает 10011012. Так как рассматривается положитель­ное число, то осталось записать его код в выбранное поле. По табл. 2.4 находим, что для этого числа может быть использовано поле любой длины. Отсюда для однобайтового поля получаем: 0100 11012, для двухбайтового — 0000 0000 0100 11012, и для четырехбайтового - 0000 0000 0000 0000 0000 0000 0100 11012.

Попутно заметим, что если число х >0, то и знаковый, и беззнаковый коды этого числа могут быть записаны в поле выбранной длины N. В этом случае его знаковый и без­знаковый коды в выбранном поле совпадают. Это видно хотя бы на примере рас­сматривавшихся ранее кодов числа +7710. А теперь возьмем, скажем, х = +15510, прямой код модуля которого 1001 10112 или 9В16. Беззнаковый код числа может быть записан в однобайтовое поле, а знаковый — нет. То, что код 100110112 не может быть знаковым однобайтовым кодом положительного числа, видно и по занятому единицей знаковому биту. В этом случае, как известно, в поле находится код отрицательного числа. Как будет показано далее, знаковый код 9В16 соответ­ствует числу -10110, в то время как знаковые коды 009В16 и 00009В16 представляют число +15510. С другой стороны все коды 9В16, 009В16 и 00009В16, рассматривае­мые как беззнаковые, соответствуют числу +15510.

Теперь получим знаковое представление числа -77. Прямой код модуля этого числа уже найден, это 1001 1012. Переходя любым из способов к дополнительно­му коду, для однобайтового поля получим 1011 00112 или В316. В случае исполь­зования двух- и четырехбайтовых полей работать с двоичными кодами неудобно. Поэтому перейдем к шестнадцатеричным кодам. Итак, для однобайтового поля прямой код модуля числа -77 равен 4В16, и тогда искомый дополнительный код есть 10016 - 4В16 = В316. Для двухбайтового поля находим: 1000016 - 4В16 = FFВ316, и, наконец, для четырехбайтового — 10000000016 - 4В16 = FFFFFFВ316.

В связи с тем, что для записи кодов знаковых чисел могут быть использованы поля различной длины, на практике возникает задача: по имеющемуся коду чис­ла в поле некоторой длины найти его код в поле большей или меньшей длины. На рис. 2.7 показаны знаковые представления для чисел +77 и -77 в полях разной длины. В двоичных кодах вертикальной чертой отделен знаковый бит поля. Сравнение этих результатов показывает, что при переходе к полю большей длины свободные слева биты поля заполняются кодом знакового бита 02 (016) для поло­жительных и 12 (F16) - для отрицательных чисел. Это правило называется пра­вилом размножения знака. Переход к полям меньшей длины в тех случаях, когда он возможен, осуществляется отбрасыванием двух, четырех или шести цифр 016 или Р16 или же соответствующего количества тетрад 00002 или 11112.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.