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

Знаковое представление формата с фиксированной точкой



В истории развития архитектуры компьютеров использовались четыре различ­ных варианта представления знаковых чисел:

· система со знаком;

· обратный код, поразрядное дополнение или код с дополнением до единицы;

· дополнительный, комплементарный код или код с дополнением до двух;

· система со смещением.

В настоящее время первые две системы устарели и практически вышли из упот­ребления. Тем не менее, по ходу изложения материала мы затронем и эти уста­ревшие системы.

Очевидно, что для машинного представления знаковых чисел нужно опреде­ленным образом закодировать знак числа и его модуль. Так как существует всего два знака чисел, «+» и «-», то самое простое напрашивающееся решение состоит в том, чтобы представить код знака одной двоичной цифрой и выделить под него один из разрядов поля, а во всех остальных разрядах записывать модуль числа, кодируя его, например, с помощью прямого двоичного кода, так же как кодируют­ся беззнаковые целые числа. Такой способ называется системой кодирования со знаком.Код знака числа принято размещать в самом левом разряде поля, кото­рый в связи с этим принято называть знаковым битом.По традиции знак «плюс» кодируется нулем, а знак «минус» — единицей. Таким образом, если в знаковом бите находится нуль, это означает, что остальные биты поля содержат модуль по­ложительного числа, а если знаковый бит занят единицей, то в них находится мо­дуль отрицательного числа. Заметим, что можно было бы договориться и о дру­гом способе кодирования знака, но по ряду причин выбран именно этот способ.

На рис. 2.4 показано размещение знаковых битов в полях разной длины. В одно­байтовом поле разряды с 0-го по 6-й содержат код модуля числа, а код знака за­нимает 7-й разряд. В двухбайтовом поле код модуля занимает разряды с 0-го по 14-й, код знака — 15-й разряд. В четырехбайтовом поле код модуля расположен в разрядах с 0-го по 30-й, а код знака находится в 31-м разряде.

Поскольку один из N битов поля отводится под код знака, под запись кода моду­ля остается N - 1 битов. Следовательно, в таком поле могут быть закодированы любые целые числа, удовлетворяющие условию |x|≤2ᴺˉ¹-1, то есть все целые числа из диапазона [1-2ᴺ¯¹; 2ᴺ¯¹-1].

Посмотрим теперь, к каким последствиям приведет принятие предлагаемого ва­рианта кодирования знаковых целых чисел. Во-первых, оказывается, что числу 010 соответствуют два различных кода: код 0000 00002 (+010) и код 1000 00002 (-010). Такая неоднозначность крайне нежелательна, так как необходимо либо дополнительно учитывать ее при различных проверках аппаратными средст­вами компьютера, либо предусматривать отдельные проверки в программах. Во-вторых, и это самое главное, возникает специальная арифметика с совер­шенно непривычными правилами выполнения самых обычных действий. Так, по правилам обычной арифметики, сложение чисел +410 и -410 дает в резуль­тате 010. А теперь выполним сложение для полученных ранее кодов этих чисел: 000001002 + 100001002 = 100010002. Как видим, получен совершенно неожидан­ный результат: вместо ожидавшегося кода числа 010 сложение дало код числа -810. Этот результат является следствием неудачного выбора способа кодирования. Его нужно выбирать исходя из логики использования кода, а не из «напрашиваю­щегося» или «очевидного» на первый взгляд подхода. Основное требование при выборе системы кодирования чисел состоит в том, что полученный код должен удовлетворять правилам выполнения сложения и вычитания в двоичной систе­ме счисления. В связи с этим код каждого следующего положительного числа должен получаться прибавлением единицы к коду текущего числа, а код каждого следующего отрицательного числа должен получаться вычитанием единицы из кода текущего числа. Построенный таким образом код принято называть допол­нительным, с дополнением до двух или комплементарным(от complementary — дополняющий).

Для простоты рассуждений рассмотрим построение этого кода на примере четы­рех битов. Подчеркнем, что при построении кодов знаковых чисел знаковый бит ни при каких условиях не может быть занят значащими цифрами кода модуля, в него не должен выполняться перенос и в нем нельзя производить заем. Итак, код числа 010 — это 00002. Код следующего положительного числа +110 получаем прибавлением к нему единицы: 00012. Аналогичным образом получаем код числа +210: 00102. Дальнейший процесс получения кодов положительных чисел изобра­жен на рис. 2.5, слева. Отметим, что при записи кода в четыре бита этот процесс можно продолжить только до числа +710, имеющего код 01112. Переход к сле­дующему положительному числу +810 с кодом 10002 приведет к занятию знако­вого бита старшей цифрой кода модуля. Следовательно, числа, большие +710, та­ким способом изобразить нельзя.

Рассмотрим теперь получение кодов отрицательных чисел. Для получения кода числа -110 вычтем из кода числа 010 единицу: 00002 - 12. Это возможно только если условиться о том, что необходимый для такого вычитания заем выполняет­ся из воображаемого дополнительного разряда: 100002 - 12 = 11112. Дальнейшее получение кодов отрицательных чисел не вызывает затруднений и показано на рис. 2.5, справа. Например, код числа -210 получается так: 11112 - 12 = 11102. Очевидно, что получение кодов чисел, меньших, чем -810, в случае использования для кода всего четырех битов невозможно, так как, например, для получения кода числа -910 нужно выполнить заем из знакового бита: 10002 - 12 = 01112. К тому же, получающийся при этом код 01112 уже используется как код числа +710.

Способ кодирования знаковых чисел, основанный на использовании дополни­тельного кода, устраняет все отмеченные ранее недостатки применения системы кодирования со знаком. Во-первых, необходимые арифметические свойства удовлетворяются автоматически по способу построения кода. Например, при сложении кодов 01002 (+410) и 11002 (-410) получается код 100002, старшая еди­ница которого не помещается в используемые четыре разряда и отбрасывается. Таким образом, остается код 00002, который в точности соответствует нужному результату. Отметим, что это общий технический прием при выполнении дейст­вий со знаковыми числами. Он аналогичен приему, использованному в рассуж­дениях при получении дополнительного кода числа -1. Можно считать, что во время выполнения аналогичных операций возвращается заем, выполненный ра­нее из воображаемого дополнительного разряда.

Во-вторых, исчезла неоднозначность кодирования нуля. В самом деле, код 10002, который раньше вместе с кодом 00002 использовался для кодирования нуля, ока­зался закрепленным за кодом максимального по модулю отрицательного чис­ла -810. Это привело к тому, что диапазоны представления положительных и от­рицательных чисел стали несимметричными. В самом деле, если для записи кода используется только 4 бита, то при выборе любого способа кодирования возмож­но формирование всего 24 = 16 различных кодов. Из них при применении систе­мы со знаком 14 кодов закреплено за ненулевыми числами из симметричного диапазона от -710 до +710, и еще два кода, 00002 и 10002, соответствуют нулю. Применение дополнительного кода позволяет изобразить шестнадцать целых чисел (вместе с нулем) из несимметричного диапазона от -810 до +710. При этом под нуль занят всего один код 00002, а закрепление второго кода 10002 за чис­лом -810 как раз и приводит к появлению несимметричности диапазона.

Приведенные рассуждения не зависят от длины поля. Поэтому при использовании дополнительных кодов для полей длиной Мбит в соотношении 1-2ᴺ¯¹ < х < 2ᴺ¯¹-1, описывающем диапазон кодируемых чисел в системе со знаком, левую границу нужно сместить на единицу в отрицательную сторону. Следовательно, при ис­пользовании дополнительных кодов в поле длиной N бит можно закодировать целые числа в диапазоне [-2ᴺ¯¹; 2ᴺ¯¹-1]

Таблица 2.4.Диапазоны представления знаковых целых чисел

Название Длина, байт Длина диапазона
shortint -2⁷…2⁷-1 -128…127
integer -2¹⁵…2¹⁵-1 -32 768…32 767
longint -2³¹…2³¹-1 - 2 147 483 648… 2 147 483 647

 

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

На рис. 2.6 сравниваются множества икодируемых в одном байте чисел для беззнакового (вверху) и знакового (внизу) представлений. Для беззнакового представления при N = 8 битов возможно кодирование множества целых из ин­тервала от 0 до 255 (табл. 2.3), а для знакового представления — от -128 до +127 (табл. 2.4). Общее количество кодов и в первом, и во втором случае равно 256. Просто эти коды оказалась закрепленными за целыми числами из различных диа­пазонов. Фактически, для знакового кодирования весь набор кодов однобайтового поля сдвинут вдоль числовой оси как единое целое назад на 128 единиц.

1.

2.

2.1.

2.2.







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