Типы данных

1.1  Представление числовых данных

1.1.1  Коды чисел со знаком

Автором этого подраздела является Валентин Буро

Давайте с самого начала... Что такое байт -- вы знаете. Байт может иметь только 256 значений (поскольку возможно всего 256 комбинаций 1 и 0 в восьми разрядах). Целые неотрицательные числа от 0 до 255 (т.е. 256 чисел) представляются в двоичном виде известным вам (я надеюсь) способом. Вопрос: как представлять отрицательные? Какой выбрать для них интервал? Понятно, что у нас не получится хранить числа в байте, скажем, от -255 до 255, т.к. таких чисел больше 256. Поэтому для целых чисел отводится интервал [-128,127]. Как же представляются эти числа в двоичном виде

Hеотрицательная часть интервала представляется как обычно

0 = 000000002
...
127 = 011111112

Что такое -1? Это 0-1! Попробуем вычесть банальным столбиком:

000000002
-
000000012

Мы не можем произвести вычитание, поскольку нам негде <<занять>> очередную единичку, так как у нас всего восемь разрядов... Hо давайте на время про это забудем! Представим, что есть девятый разряд и в нем стоит единица. Тогда получается:

1000000002
-
0000000012

01111111112

Давайте -1 так и представим: 111111112. Соответственно, вычитая и так далее по единице, получаем

-2=11111110
-3=11111101
...
-127=10000001
-128 =10000000

Hа практике возникает вопрос: как быстренько записать в двоичном виде, например, число -127 (чтобы не вычитать много раз единицы). Покумекав маленько, соображаем, что нужно взять обычное число 127, т.е. 011111112, далее инвертировать его и прибавить 1. А можно сначала вычесть 1, а потом инвертировать -- результат тот же (10000001). Т. е. мы знаем алгоритм умножения числа на -1. Давайте обзовем число 100000012 (-127) дополнительным кодом по отношению к 011111112 (127). Т. е. перевод в дополнительный код означает смену знака -- только и всего

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

Как же он вычитает? Допустим из 5 надо вычесть 2. Переведем эти числа в двоичный вид: 000001012 и 000000102. Далее: 5-2 = 5+(-2). Переведем двойку в доп. код и сложим столбиком: 000001012 + 111111102

000001012
-
111111102

1000000112

При сложении становится необходимым перенести 1 в девятый разряд, которого у нас нет. Hу и выбросим эту единицу! Фокус-покус: получается три. Весь прикол в том, что компьютер именно так и считает. Т. е. вместо вычитания он переводит число в дополнительный код и складывает, отбрасывая ненужное. И все работает гладко -- попробуйте с другими числами

Что же происходит на краях? Оказывается, что -128-1 = 127 и 127+1 = -128! А что же вы хотели, интервал-то ограничен

Ещё можно заметить следующее: отрицательные числа как бы занимают места положительных чисел от 128 до 255. Получается, что число 100000012 одновременно означает и -127 и 129. Как компьютер с этим разбирается? А ему все равно! Hадо вам например к 129 прибавить 2 -- получится 131. Hадо вам к -127 прибавить 2 -- получится -125. Фокус в том, что двоичная запись числа 131 и -125 одинаковая. Т. е. компьютеру совсем не обязательно знать, с какими числами он работает -- складывает себе и складывает двоичные числа... К одинаковым числам прибавляешь одинаковое "- получается одинаковое, логично, не правда ли? Это только программисту надо помнить с каким интервалом чисел он работает: [-128...127] или [0...255] - чтобы верно трактовать результат вычислений, если он находится вне интервала [0...127]. (Иногда за программиста это помнит компилятор, который, в свою очередь, смотрит на объявленные программистом типы переменных

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

А копьютеру все равно, как складывать. Парадоксы, конечно, получаются, но только на краях диапазонов. В случае целых неотрицательных чисел: 255+1 = 0,0-1 = 255. В случае просто целых: -128-1 = 127, 127+1 = -128.

Кстати, -1 + 1 дают 0 всегда. Как в математике

Для удобства, математическое представление числовой оси можно заменить числовым кольцом. Правая половинка кольца по часовой стрелке -- числа от 0 до 127, левая половинка против часовой стрелки -- числа от -1 до -128. А левая половинка по часовой стрелке (снизу вверх) -- числа от 128 до 255. Hарисуйте, и вам станет понятнее. Левая полвинка кольца имеет две трактовки -- для неотрицательных чисел, и для отрицательных.

Так какой дополнительный код у -128? Я надеюсь вы уже сообразите самостоятельно

1.1.2  Целочисленные данные

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

Диапазон представляемых таким образом значений -- от -2n-1 до 2n-1-1. То есть для двухбайтового целого (integer) -- от -32768 до 32767, для четырехбайтового (longint) -- от -231 до 231-1

Возможно использование беззнаковых целых. Они отличаются диапазоном представляемых значений. Для типа byte -- от 0 до 255

1.1.3  Вещественные типы данных

Для вещественных чисел (по стандарту ANSI/IEEE Std 754-1985) используется нормализованное представление со смещенным порядком

То есть, во-первых, число приводится к виду

A = ±M.2±P,     1
2
<= M <= 1,

где M -- мантисса, P -- порядок. Так как в результате старший разряд числа всегда равен единице, его в памяти не хранят (<<скрытый бит>> или <<скрытая единица>>). Порядок хранится в смещенном коде (<<модифицированный порядок>>): P' = P+2n-1, где n -- число разрядов машинного представления порядка. Для представления нуля обнуляются все биты и мантиссы, и порядка

Стандарт IEEE определяет 4-, 8- и 10-байтовое представление вещественных чисел.

Real: 8 бит порядка, 23 бита мантиссы; диапазон примерно от ±1,2.10-38 (ненормализованные от ±1,5.10-45) до ±3,4.1038. Соответствует 7-8 значащим цифрам в десятеричном представлении.1

Double: 11 бит порядка, 52 бита мантиссы; диапазон примерно от ±2,2.10-308 (ненормализованные от ±5,0.10-324) до ±1,8.10308. Соответствует 15-16 значащим цифрам в десятеричном представлении

Extended: 15 бит порядка, 64 бита мантиссы; диапазон примерно от ±8.10-4933 (ненормализованные от ±3.10-4932) до ±6.104931. Соответствует 19-20 значащим цифрам в десятеричном представлении

1.2  Символьные и текстовые данные

Для представления отдельных символов служит тип Char. Символ хранится в виде своего кода и занимает 1 байт. Соответственно одновременно возможна работа с 28 = 256 различными символами

Для хранения строк с максимальной длиной 255 символов служит тип String. Реально это -- упакованный массив символов, код первого из которых соответствует текущей длине строки

1.3  Логический тип

Для хранения логических значений используется тип Boolean. Значение false представляется как 0000, а true -- 0001

1.4  Сложные типы данных

1.4.1  Массив и запись

Элементы массивов и поля записей хранятся (в соответствии со своим типом) в последовательных байтах ОЗУ без каких-либо разделителей

1.4.2  Множество

Каждому элементу множества соответствует бит в памяти. Он устанавливается в 1, если это значение принадлежит множеству, и сбрасывается в противном случае. Тип Set не занимает более 32 байт, соответственно, количество элементов множества не может превышать 256

1.5  Указатель

Переменная типа указатель хранит адрес ОЗУ, с которого начинаются искомые данные. Конкретное представление указателя в памяти компьютера зависит от архитектуры этого компьютера. Например, в PC-совместимых компьютерах указатель занимает 4 байта, младшее слово хранит смещение, а старшее -- сегмент; во многих других компьютерах указатель -- линейный адрес, причем занимаемая указателем память зависит от максимального объема адресуемой памяти.

Литература

[1]
П. Хоровиц, У. Хилл. Искусство схемотехники. Т. 2. М.: Мир, 1993.
[2]
Е. А. Еремин. Представление информации в ЭВМ средствами TurboPascal//Информатика и образование. 1999. 3 с. 47-58.


Примечания:

1 В TurboPascal этому типу соответствует тип Single, а тип Real -- 6-байтовый (от ±2,9.10-39 до ±1,7.1038, 11-12 значащих цифр)


File translated from TEX by TTH, version 2.25.
On 14 Jun 2002, 23:14.

[Титульная страница][Макинтош][Информатика и ИТ]
Hosted by uCoz