Общие сведения.
Тип данных — это двоичный код, обладающий известными свойствами согласно принятым соглашениям. Процессор (с помощью команд) распознает тип данных и осуществляет над данными предписанный набор операций.
Ниже рассматриваются следующие типы данных:
? знаковые и беззнаковые целые, используемые для представления целых чисел в виде двоичных кодов и выполнения над ними арифметических операций по правилам двоичной арифметики;
? двоично–десятичные целые, предназначенные для представления и обработки десятичных чисел;
? булев тип данных, поддерживающий правила алгебры–логики (булевой алгебры);
? типы с фиксированной и плавающей точкой, предназначенные для представления и обработки вещественных чисел.
Выбор типа данных определяется командой программы. Например, при выполнении арифметической команды данные трактуются как целые числа, операнды в логической операции принимаются как булев тип данных, а 16–битный указатель используется командой для доступа к данным в текущем сегменте.
Отметим, что в программах на языках высокого уровня могут существовать типы данных, для которых в процессоре не предусмотрены аппаратные средства. Примером могут служить типы данных с плавающей точкой в программе на Фортране, которая выполняется в вычислительной системе без сопроцессора. В этом случае при вычислениях используются дополнительные команды для моделирования типов данных с плавающей точкой. Естественно, при наличии в системе сопроцессора (и компилятора Фортрана для него) программа будет выполняться намного быстрее.
О формах представления чисел.
Для представления чисел широко используются две формы: естественная и нормальная.
При естественной форме представления число имеет единственный вид записи, например: +195 — целое положительное число; –195 — целое отрицательное число; +0,025 — правильная положительная дробь; –195,025 — неправильная отрицательная дробь. Эта форма используется для представления целых чисел и чисел с фиксированной точкой (запятой).
При нормальной форме представления число записывается в виде
AH
=
M
.
q
П
,
(2.3.1)
где М, П — мантисса и порядок числа.
Для нормальной формы представления характерна неоднозначная запись числа, например: +195.025 = +195025 . 10 –3 = +19.5025. 101 = +0.195025 . 103. Как видно из примера, положение точки мантиссы зависит от значения порядка П. С изменением П (что всегда происходит в процессе вычислений) точка как бы начинает плавать. Поэтому нормальную форму (2.3.1) называют также формой представления чисел с плавающей точкой.
Числовая (как и любая другая) информация, подлежащая процессорной обработке, представляется в виде
n
–разрядных двоичных кодов, для хранения которых используются ячейки памяти. Двоичные коды чисел имеют различные форматы.
Формат числа представляет собой совокупность разрядов (разрядную сетку), разделенную на отдельные поля: поле знака числа, поле модуля числа, поле мантиссы, поле модуля порядка и др. Для нумерации разрядов полей используется последовательность чисел, начиная с нуля (0, 1, 2, 3, …).
Беззнаковые целые.
Этот тип данных используется для представления нуля и положительных значений целых чисел.
На рис. 2.3.1 , а приведены форматы 8–разрядных целых чисел. Знаковый бит отсутствует, поэтому диапазон представления чисел составляет 0…2
n
–1, где
n
— разрядность двоичного кода совпадает с разрядностью числа.
Знаковые целые.
Операцию вычитания двух положительных А и В чисел можно рассматривать как операцию алгебраического сложения чисел с разными знаками: А – В = А + ( –
B
). Поэтому для замены арифметической операции вычитания операцией алгебраического сложения необходимо каким–то образом представить знак числа. Обычно для знака двоичного числа отводится дополнительный разряд. Знак числа указывается в самом старшем разряде: 0 соответствует положительному знаку « + » числа, 1 — отрицательному знаку « – ».
Для представления чисел со знаком широкое распространение получил дополнительный код.
Для представления целых положительных двоичных чисел в
n
–разрядном дополнительном коде все старшие незначащие разряды (включая знаковый) необходимо заполнить нулями.
Для представления отрицательных чисел необходимо:
? проинвертировать все значащие цифровые разряды (модуль) числа;
? к полученному значению прибавить единицу;
? все старшие незначащие разряды (включая знаковый) заполнить единицами.
Например, 8–разрядный дополнительный код для положительного числа +6 имеет вид 00000110, для отрицательного числа – 6 — 11111010.
На рис. 2.3.1, б приведены форматы 8–разрядных знаковых чисел в дополнительном коде. Диапазон их представления составляет – 2(
n
–1)
… +2(
n
–1)
– 1, где (
n
–1) — разрядность значащей части числа. Современные микропроцессоры поддерживают знаковые целые длиной 16, 32 и 64 бит. Обычно используется два формата целых чисел: короткий с числом разрядов
n
и длинный с числом разрядов 2
n
. В процессе расчетов используется длинный формат, результаты выводятся в коротком формате. Если количество значащих разрядов модуля числа превышает (
n
– 1), происходит переполнение разрядной сетки, приводящее к ошибке в представлении числа из–за потери старших разрядов модуля. После выполнения арифметических операций выход результата за диапазон отмечается установкой а единицу флага переполнения О
F
.
Числа с фиксированной точкой.
При естественной форме представления вещественных чисел положение точки (запятой) фиксируется между целой и дробной частями числа. Для изменения положения точки в вещественном числе необходимо ввести масштабный коэффициент, значение которого должно быть выбрано таким образом, чтобы сохранить неизменным значение вещественного числа. Часто точка фиксируется впереди старших разрядов модуля числа. При этом представление числа А с фиксированной точкой имеет вид правильной дроби, что соответствует условию
0 < |
A
Ф
| < 1
или 2–
S
<= |
A
Ф
| <= 2–
S
, (2.3.2)
где
s
— выбранное количество значащих разрядов числа.
Условие (2.3.2) должно выполняться для исходных данных задачи и всех промежуточных результатов вычислений, что обеспечивается путем выбора масштабного коэффициента К.
При нарушении условия (2.3.2) число АФ имеет целую часть, которая теряется, так как не попадает в разрядную сетку из–за переполнения. Поэтому при определении масштабного коэффициента К следует исходить из максимального значения модуля задействованных при решении задачи чисел, приняв К> | А |
max
. Тогда условие (2.3.2) для АФ = А/К будет выполняться.
На рис. 2.3.2, а приведен формат компьютерного представления чисел АФ с фиксированной точкой. При занесении числа АФ в ячейку памяти свободные младшие разряды разрядной сетки заполняются нулями. Если число
s
значащих разрядов модуля |
A
Ф
| больше
n
– 1, то младшие разряды модуля, которые не поместились в
n
–разрядной сетке, теряются. Это приводит к погрешности, абсолютное значение которой меньше единицы младшего разряда разрядной сетки, т. е.
?
абс
< 2
n
– 1
. При
n
= 32 абсолютная погрешность
?
абс
< 2– 31
?
0.5×10– 30х0.3 = 0.5×10– 9
Пример 1.
Пусть заданы два числа А = –1010,1012 и В = +10,101012, для которых |
A
| > |
B
|
.
Поэтому масштабный коэффициент К > |
A
|
= 24 = 100002. Степень 4 свидетельствует о необходимости сдвига на 4 разряда вправо исходных чисел
A
и
B
. Действительно
АФ =
А . К= –1010,101 . 10000 =
–0.10101012;
ВФ = В . К = 10,10101 . 10000 = 0,0010101012. Форматы представления чисел АФ и ВФ показаны на рис. 2.3.2,6, в. Для сохранения точности компьютерного представления числа ВФ необходимо расширить разрядную сетку до 10 разрядов.
К достоинству представления чисел в форме с фиксированной точкой следует отнести простоту выполнения арифметических операций. Недостатки проявляются в том, что:
? необходимо производить выбор масштабных коэффициентов;
? нули в старших разрядах модуля приводят к уменьшению количества разрядов, занимаемых значащей частью модуля числа. В результате этого снижается точность представления чисел с малыми значениями модуля.
Булевы типы.
Булевы величины являются беззнаковыми и используются при логических операциях
AND
,
OR
,
XOR
,
NOT
и др. Операция выполняется над отдельными битами. Булевы операнды обрабатываются по частям, если их разрядность превышает разрядность процессора.
Двоично–десятичные целые.
В повседневной жизни человек пользуется десятичной системой счисления. Для хранения и обработки десятичных чисел в цифровых устройствах их представляют в виде двоичного кода. Представление десятичного числа, в котором каждая десятичная цифра отображается в виде двоичных символов 0 и 1, называют двоично–десятичным кодом. Так как алфавит десятичной системы состоит из 10 цифр, для записи каждой десятичной цифры выделяется слово, содержащее не менее четырех разрядов. Наиболее часто используется 4–разрядное слово, именуемое тетрадой или полубайтом. С помощью тетрад вместо требуемых 10 можно получить 24 = 16 различных комбинаций, составленных символов 0 и 1. При двоично–десятичном кодировании различным десятичным цифрам должны соответствовать различные комбинации символов О и 1, т. е. разрешены только 10 комбинаций из 16. Наличие разрешенных и запрещенных комбинаций — важное свойство двоично–десятичных кодов. Это свойство отличает их от обычных позиционных систем счисления, в которых все комбинации разрешены. Общее количество различных разрешенных 4–разрядных кодов (тетрад), определяемое сочетаниями из 16 элементов по 10, составляет: С1016= 18008. Широкое распространение получил так называемый код 8421, в котором используется первые десять значений двоичных чисел от 0000 (010) до 1001(910).
Достоинство 4–разрядных кодов состоит в том, что при кодировании десятичных чисел используется минимальное количество разрядов. Введение дополнительного 5–го разряда позволяет обнаружить ошибки при передаче числовой информации по линиям связи при наличии помех. Например, в 5–разрядном коде 2 из 5 все кодовые комбинации содержат две единицы и три нуля. Поэтому изменение любого разряда (на противоположное значение) приведет к запрещенной кодовой комбинации.
На рис. 2.3.3 приведен формат двоично–десятичного числа, содержащий 18 тетрад (
d
17…
d
0) и знаковый разряд
S
(в остальных разрядах старшего байта установлены нулевые значения). Каждая тетрада соответствует одному разряду десятичного числа.
Числа с плавающей точкой.
Во многих случаях для проведения расчетов необходимо представлять числа с высокой точностью в широком диапазоне значений. Указанным требованиям отвечает нормальная форма чисел (2.3.1). Для выявления особенностей ее использования для представления чисел с плавающей точкой в цифровых системах будем полагать, что:
? для записи мантиссы используется (
m
+ 1)–разрядный двоичный код, причем самый старший (
m
–й) разряд определяет знак мантиссы (числа), остальные разряды — модуль мантиссы. Значение модуля мантиссы |М| < 1, что соответствует фиксации точки перед значащими цифрами (разрядами) модуля мантиссы;
? для записи порядка П используется (р + 1)–разрядный двоичный код, причем самый старший (р–й) разряд определяет знак порядка, остальные разряды — модуль порядка. Порядок П (целое число) указывает на действительное положение точки в числе.
На рис. 2.3.4, а приведен формат числа с плавающей точкой.
Точность представления чисел (2.3.1) зависит от количества значащих цифр (разрядов) мантиссы. Для повышения точности числа с плавающей точкой представляются в нормализованной форме, признаком которой служит наличие значащей цифры (единицы для
q
= 2) в самом старшем разряде модуля мантиссы. Значение модуля нормализованной мантиссы при
q
= 2 лежит в пределах 2–1 <= |М| < 1 (для любых порядков П). В нормализованной форме могут быть представлены все числа из некоторого диапазона за исключением нуля.
Пример 2.
Представим в формате с плавающей точкой двоичные числа А = +10010.10101 и В = –111.0101. Запишем А и В в нормализованной форме
А = +0.1001010101 . 25, В= –0.1110101000 . 2–3.
(2.3.4)
На основании (2.3.4) записываем модули мантиссы |М
A
| = 10010101012, |М
B
| = 11101010002 и модули порядка в двоичной системе исчисления |ПА| = 510 = 01012, |П
B
| = 310 = 00112. Выбираем общее число разрядов разрядной сетки
m
+ р = 16. Принимаем количество разрядов для модуля мантиссы, равное 10, для модуля порядка — 4.
Форматы чисел А и В показаны на рис. 2.3.4, 6, в. Мантисса и порядок операнда В, имеющие отрицательное значение, представлены в дополнительном коде:
|
MB
|# + 1 = 0001010111 + 1 = 0001011110;
|П
B
|# + 1 = 0011 + 1 = 0100, где # — инверсия.
Поскольку абсолютная погрешность представления чисел с плавающей точкой зависит от порядка П, дадим оценку относительной погрешности:
?
отн
= ?|
M
| абс
/ |
M
|
min
< 2 –
m
/ 2 –1 = 2 –(
m
–1)
.
где ?|
M
| абс
= 2 –
m
— абсолютная погрешность представления модуля
m
–разрядной мантиссы; |
M
|
min
= 22 –1 — минимальное значение нормализованного модуля мантиссы.
Отметим, что в стандарте
IEEE
754/854 используется порядок в форме П = Р – Е, где Е =
const
— смещение порядка; Рмакс = 2Е. Это позволило исключить поле
знака порядка в формате представления чисел.