ТОП 10:

Двоичное кодирование числовой информации. Представление числовой информации в компьютере.



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

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

Беззнаковые целые числа представляются в машине наиболее просто. Для этого достаточно перевести требуемое число в двоичную форму и дополнить полученный результат слева нулями до стандартной разрядности. Например, восьмиразрядное число 14 будет иметь вид

0000 1110

Это же самое число в 16-разрядном представлении будет иметь слева еще 8 нулей.

Не менее просто определить минимальное и максимальное значение чисел для N-разрядного беззнакового целого: минимальное состоит из одних нулей, а значит, при любом N равняется нулю; максимальное, напротив, образовано одними единицами и, разумеется, для разных N различно. Для вычисления максимально допустимого значения обычно используют формулу

Max = 2N - 1

Целые числа со знаком. Добавление отрицательных значений приводит к появлению некоторых новых свойств. Ровно половина из всех 2N чисел теперь будут отрицательными; учитывая необходимость нулевого значения, положительных будет на единицу меньше, т.е. допустимый диапазон значений оказывается принципиально несимметричным.

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

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

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

В его основе лежит запись отрицательных чисел в виде

2N - |m|


где N, как обычно, количество двоичных разрядов, а m – значение числа. Поскольку фактически вместо числа теперь записывается его дополнение до некоторой характерной величины 2N, то такой код назвали дополнительным. Способ расчета, вытекающий непосредственно из определения, не слишком хорош, поскольку требует от конструкции процессора дополнительного разряда. Поэтому для практического получения кода отрицательных чисел используется следующий эквивалентный алгоритм. Для преобразования отрицательного числа в дополнительный код необходимо:

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

Например, переведем число –8 в двоичный 8-разрядный код. Возьмем модуль числа и дополним его до необходимого числа разрядов нулями слева:

0000 1000


Теперь проинвертируем:

1111 0111


и, наконец, прибавим единицу. Получим окончательный ответ

1111 1000

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

Хотя дополнительный код гораздо менее наглядный, чем прямой, он позволяет значительно проще реализовать арифметические операции. Более того, наличие дополнительного кода позволяет упразднить действие вычитания, сводя его к сложению с дополнительным кодом вычитаемого.

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

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

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

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

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

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

Удобное представление вещественных чисел не пришлось специально придумывать. В математике уже существовал подходящий способ записи, основанный на том факте, что любое число A в системе счисления с основанием Q можно записать в виде

 

A = (±M) * Q ±P ,


где M называют мантиссой, а показатель степени P - порядком числа.

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

3*108 = 30*107 = 0,3*109 = 0,03*1010 = ...

Поэтому договорились для выделения единственного варианта записи числа считать, что мантисса всегда меньше единицы, а ее первый разряд содержит отличную от нуля цифру – в нашем примере обоим требованиям удовлетворит только число 0,3*109. Описанное представление чисел называется нормализованным и является единственным. Любое число может быть легко нормализовано.

Требования к нормализации чисел вводятся исходя из соображений обеспечения максимальной точности их представления. Все сказанное о нормализации можно применять и к двоичной системе:

A = (± M) * 2 ±P, причем ½ ≤ M <1.

Например: -310 = -0,11*210: M=0,11 и P=10. Существенно, что двоичная мантисса всегда начинается с единицы (M ≥ ½). Поэтому во многих ЭВМ эта единица не записывается в ОЗУ, что позволяет сохранить еще один дополнительный разряд мантиссы (так называемая скрытая единица).

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

Таким образом, видно, что при использовании метода представления вещественных чисел с плавающей запятой фактически хранится два числа: мантисса и порядок. Разрядность первой части определяет точность вычислений, а второй – диапазон представления чисел.

К описанным выше общим принципам представления вещественных чисел необходимо добавить правила кодирования мантиссы (особенно отрицательной) и порядка. Эти правила могут отличаться для различных машин. Для IBM PC мантисса хранится в прямом коде, а для хранения порядка используется так называемый сдвиг: к значению порядка прибавляется некоторая константа. В результате все значения порядка будут положительными беззнаковыми числами и, при описанном представлении порядка упрощается операция сравнения произвольного числа с нулем, которая выполняется аппаратно довольно часто. Не все двоичные комбинаций для вещественных чисел соответствуют "правильным" числам, некоторые из них кодируют бесконечные значения, а некоторые – нечисловые данные (NaN – not a number). Подобные "неправильные" данные обрабатываются по специальным правилам.

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

IEEE Standard 754 - множество форматов и операций для чисел с плавающей точкой. Форматы имеют размеры операндов 32, 64 и 80 разрядов. Этот стандарт принят Институтом инженеров по электротехнике и радиоэлектронике (IEEE). Модуль обработки операций с плавающей точкой поддерживает все форматы, предусматриваемые данным стандартом. Он обладает 15-разрядным специальным порядком, 64-разрядной мантиссой. Этот формат позволяет хранить ненормализованные числа.

 







Последнее изменение этой страницы: 2016-07-11; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.215.33.158 (0.007 с.)