Представление информации в ЭВМ. Прямой код
В современных ЭВМ используются, в основном, два способа представления двоичных чисел — с фиксированной и с плавающей запятой, причем в формате с фиксированной запятой (ФЗ) используется как беззнаковое представление чисел ("целое без знака"), так и представление чисел со знаком. В последнем случае знак также кодируется двоичной цифрой — обычно плюсу соответствует 0, а минусу — 1. Под код знака обычно отводится старший разряд а0 двоичного вектора а0а1а2...an, называемый знаковым. (Страница47) Запятая может быть фиксирована после любого разряда двоичного числа, однако чаще всего используются два формата ФЗ: целые числа, когда запятая фиксируется после младшего разряда an, а диапазон представления лежит в пределах (3.12) и дробные числа — запятая фиксирована после a0, а диапазон (3.13) Далее, если не сделано специальных оговорок, будем рассматривать дробные двоичные числа со знаком, запятая в которых фиксирована после знакового разряда a0: (3.14) Очевидно, если двоичное число A=0, а1а2а3...an>0, то оно будет представлено в форме (3.14) как 0, а1а2а3...an, а если A=0, а1а2а3...an<0, то как 1, а1а2а3...an. Приведенное кодирование дробных двоичных чисел со знаком принято называть прямым кодом числа (обозначается как [A]d). Итак (3.15) 3.4. Алгебраическое сложение/вычитание в прямом коде Сформулируем правила выполнения операций сложения и вычитания чисел со знаками (такие операции принято называть алгебраическими). Во-первых, алгебраическое вычитание всегда можно свести к алгебраическому сложению, изменив знак второго операнда. Далее следует сравнить знаки слагаемых. При одинаковых знаках складывают модули слагаемых и результату присваивают знак любого слагаемого (они одинаковые). Если знаки слагаемых разные, то из большего модуля слагаемого вычитают меньший модуль и присваивают результату знак слагаемого, имеющего больший модуль. (Страница48) Введем обозначения: где: □ a0, b0 — знаковые разряды слагаемых; □ с0 — код знака результата; □ — двоичные переменные; □ f — тип выполняемой операции: f =0 — сложение, f= 1 — вычитание; □ OV — признак переполнения, и выразим сформулированный выше алгоритм алгебраического сложения/вычитания в форме граф-схемы алгоритма (ГСА), приведенной на рис. 3.3. Отдельно следует рассмотреть проблему обнаружения факта переполнения разрядной сетки данных с фиксированной запятой. Это может произойти, если Очевидно, при сложении чисел с разными знаками переполнение невозможно. Если знаки слагаемых одинаковы, признаком переполнения может служить перенос, возникающий при сложении старших разрядов модулей а1+b1. При отсутствии этого переноса сложение двух любых одинаковых знаковых разрядов даст в результате с0=0, а при появлении переноса из первого разряда с0=1. Таким образом, после сложения чисел с одинаковыми знаками значение знакового разряда суммы можно рассматривать как признак переполнения OV. Характерно, что полученное в знаковом разряде с0 значение не является знаком результата (алгебраической суммы). Истинное значение знака образуется не в процессе арифметической операции над знаковыми разрядами, а формируется искусственно. Рассмотрим случай сложения чисел с разными знаками. Он сводится к вычитанию модулей слагаемых, причем уменьшаемым должен стать больший модуль. Чтобы избежать дополнительной модульной операции сравнение,можно произвести "наугад" вычитание A - В. Признаком того, будет отсутствие заема из нулевого в первый разряд. Поскольку рассматривается случай разных знаков слагаемых, то при отсутствии заема значение знакового разряда разности определится как 0-1=1-0=1, а при наличии заема 0-1-1=1-0-1=0. Таким образом, если при вычитании A - В получим c0=1, это будет означать, что и результату следует присвоить знак числа A (с0:= а0). Если окажется с0 =0, то и следует осуществить вычитание B - А, присвоив результату знак числа B (с0 :=b0). Рис. 3.3. Граф алгоритма алгебраического сложения-вычитания
|