Знаковое представление формата с фиксированной точкой
В истории развития архитектуры компьютеров использовались четыре различных варианта представления знаковых чисел: · система со знаком; · обратный код, поразрядное дополнение или код с дополнением до единицы; · дополнительный, комплементарный код или код с дополнением до двух; · система со смещением. В настоящее время первые две системы устарели и практически вышли из употребления. Тем не менее, по ходу изложения материала мы затронем и эти устаревшие системы. Очевидно, что для машинного представления знаковых чисел нужно определенным образом закодировать знак числа и его модуль. Так как существует всего два знака чисел, «+» и «-», то самое простое напрашивающееся решение состоит в том, чтобы представить код знака одной двоичной цифрой и выделить под него один из разрядов поля, а во всех остальных разрядах записывать модуль числа, кодируя его, например, с помощью прямого двоичного кода, так же как кодируются беззнаковые целые числа. Такой способ называется системой кодирования со знаком.Код знака числа принято размещать в самом левом разряде поля, который в связи с этим принято называть знаковым битом.По традиции знак «плюс» кодируется нулем, а знак «минус» — единицей. Таким образом, если в знаковом бите находится нуль, это означает, что остальные биты поля содержат модуль положительного числа, а если знаковый бит занят единицей, то в них находится модуль отрицательного числа. Заметим, что можно было бы договориться и о другом способе кодирования знака, но по ряду причин выбран именно этот способ. На рис. 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.Диапазоны представления знаковых целых чисел
При сравнении диапазонов чисел из табл. 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 Все права принадлежат авторам размещенных материалов.
|