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

Для представления информации в памяти ЭВМ используется двоичный способ кодирования.

Элементарная ячейка памяти ЭВМ имеет длину 8 бит (байт). Каждый байт имеет свой номер (его называют адресом). Наибольшую последовательность бит, которую ЭВМ может обрабатывать как единое целое, называют машинным словом. Длина машинного слова зависит от разрядности процессора и может быть равной 16, 32, 64 битам и т.д.

Двоично-десятичное кодирование

В некоторых случаях при представлении чисел в памяти ЭВМ используется смешанная двоично-десятичная «система счисления», где для хранения каждого десятичного знака нужен полубайт (4 бита) и десятичные цифры от 0 до 9 представляются соответствующими двоичными числами от 0000 до 1001. Например, упакованный десятичный формат, предназначенный для хранения целых чисел с 18-ю значащими цифрами и занимающий в памяти 10 байт (старший из которых знаковый), использует именно этот вариант.

 

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

Другой способ представления целых чисел – дополнительный код. Диапазон значений величин зависит от количества бит памяти, отведенных для их хранения. Например, величины типа «короткое целое число» лежат в диапазоне от -32768 (-215) до 32767 (215 - 1) и для их хранения отводится 2 байта (16 бит); типа «длинное целое число» - в диапазоне от -231 до (231-1) и размещаются в 4 байтах (32 бита); типа «слово» - в диапазоне от 0 до 65535 (216 - 1) (используется 2 байта) и т.д.

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

Разряды нумеруются справа налево, начиная с 0.

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

Пример.

Пусть число 3710=1001012 объявлено величиной типа «короткое целое» (шестнадцатибитовое со знаком).

Тогда его прямым кодом будет 0000000000100101.

Пример.

Пусть число 3710=1001012 объявлено величиной типа «длинное целое» (тридцатидвухбитовое со знаком).

Тогда его прямым кодом будет 00000000000000000000000000100101.

 

Для более компактной записи чаще используют шестнадцатеричное представление кода. Полученные коды можно переписать соответственно как 002516 для примера 1 и 0000002516 для примера 2.

Дополнительный код целого отрицательного числа может быть получен по следующему алгоритму:

1. записать прямой код модуля числа;

2. инвертировать его (заменить единицы нулями, нули – единицами);

3. прибавить к инверсному коду единицу.

 

Пример.

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

  1. прямой код числа 37 есть 00000000000000000000000000100101;
  2. инверсный код 11111111111111111111111111011010;
  3. дополнительный код 11111111111111111111111111011011 или FFFFFFDB16.

 

При получении числа по его дополнительному коду, прежде всего, необходимо определить его знак. Если число окажется положительным, то просто перевести его код в десятичную систему счисления. В случае отрицательного числа необходимо выполнить следующий алгоритм:

1. вычесть из кода числа 1;

2. инвертировать код;

3. перевести в десятичную систему счисления. Полученное число записать со знаком минус.

 

Пример.

Записать числа, соответствующие дополнительным кодам:

1) Код 0000000000010111.

Поскольку в старшем разряде записан нуль, то результат будет положительным. Это код числа 23.

2) Код 1111111111000000.

Здесь записан код отрицательного числа. Тогда выполняется алгоритм:

  1. вычесть из кода числа единицу 11111111110000002 - 12 = 11111111101111112;
  2. инвертировать код 0000000001000000;
  3. перевести в десятичную систему счисления 10000002 = 6410.

Полученное число записать со знаком минус, тогда ответ: -64.

 

Кодирование вещественных чисел

Несколько иной способ применяется для представления в памяти персонального компьютера действительных чисел. Рассмотрим представление величин с плавающей точкой.

Любое действительное число можно записать в стандартном виде

M × 10p,

где 1 £ M < 10, p – целое.

Например, 120100000 = 1,201 × 108. Поскольку каждая позиция десятичного числа отличается от соседней на степень числа 10, умножение на 10 эквивалентно сдвигу десятичной запятой на одну позицию вправо. Аналогично деление на 10 сдвигает десятичную запятую на позицию влево. Поэтому приведенный выше пример можно продолжить: 120100000 = 1,201 × 108 = 0,1201 × 109 = 12,01 × 107. Десятичная запятая "плавает" в числе и больше не помечает абсолютное место между целой и дробной частями.

В приведенной выше записи M называют мантиссой числа, а p — его порядком. Для того чтобы сохранить максимальную точность, вычислительные машины почти всегда хранят мантиссу в нормализованном виде, что означает, что мантисса в данном случае есть число, лежащее между 110 и 210 (1 £ M < 2). Основание системы счисления здесь — число 2. Способ хранения мантиссы с плавающей точкой подразумевает, что двоичная запятая находится на фиксированном месте. Фактически подразумевается, что двоичная запятая следует после первой двоичной цифры, т.е. нормализация мантиссы делает единичным первый бит, помещая тем самым значение между единицей и двойкой. Место, отводимое для числа с плавающей точкой, делится на два поля. Одно поле содержит знак и значение мантиссы, а другое содержит знак и значение порядка.

Современный персональный компьютер позволяет работать с действительными типами, указанными в таблице 2.1 (диапазон значений указан по абсолютной величине; в некоторых случаях перечень типов данных может быть расширен):

 

Таблица 2.1. Типы данных ПК

Тип Диапазон Мантисса Байты
Real 2,9×10-39..1,7×1038 11-12
Single 1,5×10-45..3,4×1038 7-8
Double 5,0×10-324..1,7×10308 15-16
Extended 3,4×10-4932..1,1×104932 19-20

 

Пример. Преобразовать действительное число для представления его в памяти ЭВМ (величина типа Double).

Как видно из таблицы, величина это типа занимает в памяти 8 байт (64 бита). На рисунке 2.3 показано, как здесь представлены поля мантиссы и порядка (нумерация битов осуществляется справа налево):

 

S Смещенный порядок Мантисса
     
             

 

Рисунок 2.3. Формат действительного числа типа Double

 

Старший бит, отведенный под мантиссу, имеет номер 51, т.е. мантисса занимает младшие 52 бита. Перед запятой должен стоять бит целой части мантиссы, но поскольку она всегда равна 1, здесь данный бит не требуется и соответствующий разряд отсутствует в памяти (но он подразумевается). Значение порядка хранится здесь не как целое число, представленное в дополнительном коде. Для упрощения вычислений и сравнения действительных чисел значение порядка в ЭВМ хранится в виде смещенного числа, т.е. к настоящему значению порядка перед записью его в память прибавляется смещение. Смещение выбирается так, чтобы минимальному значению порядка соответствовал нуль. Например, для типа Double порядок занимает 11 бит и имеет диапазон от -1023 до 1023, поэтому смещение равно 102310 = 11111111112. Бит с номером 63 указывает на знак числа.

Таким образом, из вышесказанного вытекает следующий алгоритм для получения представления действительного числа в памяти ЭВМ:

  1. перевести модуль данного числа в двоичную систему счисления;
  2. нормализовать двоичное число, т.е. записать в виде M × 2p, где M — мантисса (ее целая часть равна 12) и p — порядок, записанный в десятичной системе счисления;
  3. прибавить к порядку смещение и перевести смещенный порядок в двоичную систему счисления;
  4. учитывая знак заданного числа (0 — положительное; 1 — отрицательное), выписать его представление в памяти ЭВМ.

 

Пример. Записать код числа -312,3125.

  1. Двоичная запись модуля этого числа имеет вид 100111000,0101.
  2. Имеем 100111000,0101 = 1,001110000101 × 28.
  3. Получаем смещенный порядок 8 + 1023 = 1031. Далее имеем 103110 = 100000001112.
  4. Окончательно

 

S Смещенный порядок Мантисса
             

 

Более компактно полученный код стоит записать следующим образом: C07385000000000016.

 

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

 

Пример. Пусть дан код 3FEC60000000000016 или

 

S Смещенный порядок Мантисса