Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика / Лекции / Лекции.docx
Скачиваний:
180
Добавлен:
11.04.2015
Размер:
4.32 Mб
Скачать

1.4. Представление данных в памяти компьютера

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

Представление целых беззнаковых чисел

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

  1. Если текущее число меньше 2, то записать его в младший разряд результата, выполнение прекратить. Иначе, разделить текущее число с остатком на 2.

  2. Остаток записать в младший разряд результата.

  3. Применить пункт 1 к частному.

Это можно наглядно продемонстрировать с помощью деления «уголком».

Деление «уголком»

Теперь достаточно записать справа налево выделенные цифры, и получится ответ: 10 00110111. Чтобы представить это число в системе с фиксированным числом разрядов (например, 16), нужно неиспользованные старшие разряды заполнить нулями: 00000010 00110111.

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

1∙29+0∙28+0∙27+0∙26+1∙25+1∙24+0∙23+1∙22+1∙21+1∙20=512+0+0+0+32+16+0+4+2+1=567.

Шестнадцатеричная система как удобная форма записи

Все эти вычисления занимают время и требуют большой внимательности при выполнении, поэтому использовать десятичную систему в программировании не очень удобно. Неудобно использовать также и двоичную систему из-за большого числа разрядов. Для того, чтобы представлять в удобочитаемой форме двоичные данные используется шестнадцатеричная система счисления. В ней используются цифры от 0 до 9 и латинские буквы от A до F.

010=016

810=816

110=116

910=916

210=216

1010=A16

310=316

1110=B16

410=416

1210=C16

510=516

1310=D16

610=616

1410=E16

710=716

1510=F16

810=816

1610=1016

Эта система счисления обладает очень важным свойством: любые четыре цифры двоичного числа (называемые тетрадой) всегда соответствуют одному шестнадцатеричному знаку:

00002=016

10002=816

00012=116

10012=916

00102=216

10102=A16

00112=316

10112=B16

01002=416

11002=C16

01012=516

11012=D16

01102=616

11102=E16

01112=716

11112=F16

10002=816

100002=1016

Поэтому совершенно тривиально осуществляется перевод из двоичной системы в шестнадцатеричную и обратно: достаточно запомнить эту таблицу, и просто заменять тетрады соответствующими знаками или наоборот. Таким образом, максимальное значение одного байта записывается как FF16, а максимальное значение, с которым может работать 32-разрядный процессор без применения математического сопроцессора – FFFFFFFF16.

Восьмиричная система счисления

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

010=08

810=118

110=18

910=128

210=28

1010=138

310=38

1110=148

410=48

1210=158

510=58

1310=168

610=68

1410=178

710=78

1510=208

810=108

1610=218

0002=08

0012=18

0102=28

0112=38

1002=48

1012=58

1102=68

1112=78

10002=108

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

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

Прямой код

Прямой и дополнительный коды

Итак, представление целых беззнаковых чисел в двоичном коде проблемы не составляет. Возникает вопрос, что делать с целыми знаковыми числами. Первое и очевидное решение – это использовать старший бит двоичного числа для хранения знака: 0, если знак «+» и 1, если знак «−». Подобное решение называют прямым кодом. Например, для случая 8-разрядной системы, 6510=010000012, а −6510=110000012. Однако данная система создаёт серьёзную проблему: a−b≠a+(−b). Действительно: 00110010−00110010=0, а 00110010+10110010=11100100, что абсурдно. Значит, нужно на уровне процессора отдельно определять операции сложения и вычитания, всегда следить за тем, чтобы вычисления производились с числами одного знака. Знак же результата определять путём сравнения исходных чисел.

Дополнительный код

Существует другое, не вполне очевидное на первый взгляд, но очень эффективное решение – дополнительный код. Чтобы изменить знак числа в дополнительном коде, нужно выполнить такую операцию −a=ā+1, где черта над буквой – знак инверсии, замены всех нулей единицами, а единиц нулями. 6510=010000012, а −6510=101111102. Попробуем сложить эти два числа – получим 1 000000002, то есть, 256. Вспомним, однако, что мы работаем с 8-разрядной системой, а число 1 000000002 в ней записать невозможно. Поэтому старший бит 1 выйдет за границы числа, и в итоге останется 000000002, что является верным. Интересно заметить, что старший бит числа по-прежнему отвечает за знак, а потому можно использовать его значение для того, чтобы узнать знак числа. Но уже нельзя использовать простую инверсию старшего бита для смены знака. Тем не менее, такое небольшое усложнение операции смены знака ведёт к огромному упрощению остальных операций – их можно производить, не задумываясь о знаке, результат всегда будет верным.

Представление чисел с фиксированной запятой

Следующим этапом усложнения типов представляемых данных является представление десятичных дробей. Исторически первым явилось решение представлять их в формате с фиксированной запятой (точкой) [1]. При этом определённое количество бит числа отдаётся под целую часть, а остальные разряды – под дробную. Несложно заметить, что такое представление данных является во многом искусственным, поскольку достаточно домножить все вводимые данные на 2число бит дробной части, чтобы полностью избавиться от необходимости применения записи с фиксированной запятой. К тому же, такая запись сильно ограничивает диапазон возможных значений чисел.

Представление чисел с плавающей запятой

31 30 . . . 23 22 . . . 0

S E M

Числа с плавающей запятой

На практике применяется метод записи чисел в формате с плавающей запятой (точкой). Этот формат представляет собой компьютерную реализацию экспоненциальной записи чисел. Представление чисел с плавающей точкой определяется стандартом IEEE 754-1985. В соответствии с этим стандартом, разряды, выделенные для представления числа, делятся на три поля: S, E и M. Поле S представляет собой один бит, отвечающий за знак числа (0, если «+» и 1, если «−»). Поле E — это набор бит, количество которых зависит от конкретного типа данных, выделенный под экспоненту (порядок числа). Проблема хранения отрицательных значений экспоненты решается следующим образом: к реальному значению экспоненты добавляется число 2(число бит экспоненты)-1. Например, в случае восьмиразрядной экспоненты, 000000012=−12710, а 100000012=210. Поле M представляет собой набор бит, выделенный под мантиссу. Мантисса в компьютере имеет важную особенность: всегда верно неравенство 1≤M<2. За счёт этого её целая часть всегда равна 1, а потому при вычислениях отбрасывается. Таким образом, мантисса представляет собой целое беззнаковое. Стандартом IEEE 754-1985 предусмотрено три типа чисел с плавающей точкой:

  • В 32-битном типе, называемом так же вещественным одинарной точности, под мантиссу выделены биты с 0 по 22, под экспоненту — с 23 по 30, 31 — под знак. Этот тип позволяет хранить числа от -3,4∙1038 до 3,4∙1038.

  • В 64-битном типе, называемом так же вещественным двойной точности, под мантиссу выделены биты с 0 по 51, под экспоненту — с 52 по 62, 63 — под знак. Этот тип позволяет хранить числа от -1,79∙10308 до 1,79∙10308.

  • В 80-битном типе, называемом так же вещественным расширенной точности, под мантиссу выделены биты с 0 по 63, под экспоненту — с 64 по 78, 79 — под знак. Этот тип позволяет хранить числа от -1,18∙104392 до 1,18∙104392.

Вычисления с плавающей точкой осуществляет математический сопроцессор.

Соседние файлы в папке Лекции