Способы получения дополнительных кодов целых чисел ⇐ ПредыдущаяСтр 3 из 3
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 Все права принадлежат авторам размещенных материалов.
|