Макинтош и образование:Информатика и ИТ:Типы данных |
1.1 Представление числовых данных1.1.1 Коды чисел со знакомАвтором этого подраздела является Валентин Буро Давайте с самого начала... Что такое байт -- вы знаете. Байт может иметь только 256 значений (поскольку возможно всего 256 комбинаций 1 и 0 в восьми разрядах). Целые неотрицательные числа от 0 до 255 (т.е. 256 чисел) представляются в двоичном виде известным вам (я надеюсь) способом. Вопрос: как представлять отрицательные? Какой выбрать для них интервал? Понятно, что у нас не получится хранить числа в байте, скажем, от -255 до 255, т.к. таких чисел больше 256. Поэтому для целых чисел отводится интервал [-128,127]. Как же представляются эти числа в двоичном виде Hеотрицательная часть интервала представляется как обычно
Что такое -1? Это 0-1! Попробуем вычесть банальным столбиком:
Мы не можем произвести вычитание, поскольку нам негде <<занять>> очередную единичку, так как у нас всего восемь разрядов... Hо давайте на время про это забудем! Представим, что есть девятый разряд и в нем стоит единица. Тогда получается:
Давайте -1 так и представим: 111111112. Соответственно, вычитая и так далее по единице, получаем
Hа практике возникает вопрос: как быстренько записать в двоичном виде, например, число -127 (чтобы не вычитать много раз единицы). Покумекав маленько, соображаем, что нужно взять обычное число 127, т.е. 011111112, далее инвертировать его и прибавить 1. А можно сначала вычесть 1, а потом инвертировать -- результат тот же (10000001). Т. е. мы знаем алгоритм умножения числа на -1. Давайте обзовем число 100000012 (-127) дополнительным кодом по отношению к 011111112 (127). Т. е. перевод в дополнительный код означает смену знака -- только и всего Почему же удобно именно такое представление отрицательных чисел? Дело в том, что компьютеру не обязательно <<знать>> вычитание, т. е. в него можно не закладывать соответствующий алгоритм, упростив таким образом интегральные схемы. Как же он вычитает? Допустим из 5 надо вычесть 2. Переведем эти числа в двоичный вид: 000001012 и 000000102. Далее: 5-2 = 5+(-2). Переведем двойку в доп. код и сложим столбиком: 000001012 + 111111102
При сложении становится необходимым перенести 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) используется нормализованное представление со смещенным порядком То есть, во-первых, число приводится к виду
где 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 В 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. |