Представление чисел в ЭВМ

 

В цифровых ЭВМ числовая информация представляется в двух формах:

- с фиксированной точкой (естественная форма);

- с плавающей точкой (экспоненциальная форма).

При представлении чисел с фиксированной точкой подразумевается, что положение точки, разделяющей число на целую и дробную части, неизменно для всех чисел. Эта форма наиболее проста, естественна, но имеет небольшой диапазон представления чисел и поэтому не всегда приемлема при вычислениях. В современных ЭВМ естественная форма используется, например, для представления целых чисел (дробная часть числа всегда отсутствует), денежных сумм (дробная часть всегда составляет четыре знака).

Представление с плавающей точкой любого числа N в общем виде описывается следующей формулой:

N = ± M × p±k,(3.3)

где ±M – мантисса (дробная часть) числа; p – основание системы счисления; ±k – порядок (целое число), при этом положительный знак мантиссы и порядка может опускаться, а при указании порядка в десятичной системе принято использовать символ Е. Например, десятичное число с фиксированной точкой 123,45 может быть представлено в форме с плавающей точкой как 0,12345 × 103, или, как это принято, 1,2345Е+02. Такая форма представления имеет огромный диапазон отображения чисел и является основной в современных ЭВМ.

Для представления положительных и отрицательных чисел в машинах используются специальные коды: прямой, обратный и дополнительный. Причём два последних позволяют заменить неудобную для ЭВМ операцию вычитания на операцию сложения с отрицательным числом; дополнительный код обеспечивает более быстрое выполнение операций при помощи сумматора, поэтому в ЭВМ применяется чаще именно он. Рассмотрим правила кодирования на примере целых чисел.

Для перевода числа в прямой код знак числа опускается, а в старший (знаковый) разряд ставится 0, если число положительное, и 1 – если число отрицательное. Младшие разряды кода являются двоичным представлением модуля числа. Оставшиеся разряды кода заполняются нулями. Отметим, что перевод положительных чисел в прямой, обратный и дополнительный код не изменяет изображения этих чисел (табл. 3).

Для перевода отрицательного числа в обратный код необходимо все разряды прямого кода, кроме знакового, инвертировать (заменить нули единицами, а единицы – нулями).

Для перевода отрицательного числа в дополнительный код необходимо к младшему разряду его обратного кода прибавить единицу.

Перевод отрицательного числа из дополнительного кода в прямой осуществляется в обратной последовательности: сначала вычитается единица, затем инвертируются разряды. Отметим, что положительное число (0 в старшем разряде) обратному переводу не подвергается, и имеет одинаковую запись как в прямом коде, так и в дополнительном.

 

Таблица 3

Примеры представления целых чисел

в шестнадцатиразрядных двоичных кодах

Число Прямой код Обратный код Дополнительный код
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0001 0000 0000 0000 0001 0000 0000 0000 0001
-1 1000 0000 0000 0001 1111 1111 1111 1110 1111 1111 1111 1111
0000 0000 0001 0100 0000 0000 0001 0100 0000 0000 0001 0100
-20 1000 0000 0001 0100 1111 1111 1110 1011 1111 1111 1110 1100

 

При написании программ важно определить диапазоны значений и формы представления обрабатываемой информации. Например, в языках программирования семейства BASIC (Бейсик) типы переменных INTEGER и LONG используются, соответственно, для хранения целых чисел со знаком в шестнадцатиразрядном (два байта, или полуслово) и тридцатидвухразрядном (четыре байта, или машинное слово) дополнительном коде.

Знак числа фиксируется в нулевом бите первого байта (крайний левый бит). Цифровая часть числа хранится в остальных битах поля числа, причём младший двоичный разряд числа находится в последнем, правом бите последнего байта. Переменные типа SINGLE и DOUBLE используются для хранения чисел с плавающей точкой в четырёх или восьми байтах (двойное слово) соответственно.

Знак хранится в нулевом бите, биты 1–7 отводятся под порядок числа, остальные биты используются для разрядов мантиссы. Как правило, мантисса хранится в нормальном виде, т.е. первым её разрядом не является 0.

Для упрощения операций над n-разрядными порядками чисел с плавающей запятой используется смещённый код, или так называемый код с избытком 2n-1. То есть значения диапазона [-2n-1; 2n-1-1] смещаются в диапазон [0; 2n-1], что позволяет работать с порядками как с целыми без знака.

В различных преобразовательных устройствах (для кодирования положений валов, дисков и т.п.) широко используется код Грея (табл. 4). Главная особенность кода – соседние кодовые слова различаются только в одном разряде. Поэтому при последовательном переходе от числа к числу погрешность считывания не превосходит единицы младшего разряда независимо от того, в каком разряде имела место неопределённость. Для перевода числа из кода Грея в обычный двоичный код все нули и первую единицу со стороны старших разрядов оставляют без изменения. Каждый последующий разряд либо инвертируется, если число предшествующих единиц нечётно, либо остаётся без изменения.

 

Таблица 4

Представление десятичных чисел в четырёхразрядном коде Грея

Десятичное число Двоичный код Код Грея Десятичное число Двоичный код Код Грея