Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 60
Текст из файла (страница 60)
В цих отсутствует бит, отвечающий знаку, а остальных битов ровно столько, сколько нужно для двоичного представлепия чисел из требуемого диапазона, как в случае целочисленного поддиапазоиа. например, н определенном раисе перечислении С1455 имеется всего четыре раз<и<чин<х элемента, которые во время выполнения программы представляются как 0 = Гге51<, 1 = БорЬ, 2 = Свп ог и 3 = Бел<оп, поэтому для представления этих элементов в памяти компьютера достаточно двух битов. Следовательно, для переменной типа С1455 в памяти отводится областьдлнпой два бита.
Операции зоссезьог и рге<1есеззог сводятся просто к добавлсшпо и вычитанию едишшы иэ целочисленного представления элементов перечислен<и и проверке того, что получснпь<й результат ие выход<лт за допустимые границы. В С программист может отменить сопоставляем ые по умолчанию целочисленные значения и назначить другие произвольным образом, <шпример епнж с1444 <<ге<в=14. 5орв-Зб. Зьп<ег-4, 5еп ог-42] Для определяем<по указанным способом представления перечислений рсмпзация элементарных операций не составляет труда, так как можно исполь:<овать встроенные в аппаратуру операции иад целыми числами.
Например, опсрапип отношения между элементами перечисления =, > и < можно реализовать при помощи аппаратных команд сравнения целых чисел. 5.2.3. Логические (булевы) значения В большинстве языков предусмотрен логический (булез) тип данных для представления значений истина и ложь. Спецификация. Логический тип данных состоит из объектов, которые могут принимать два значения: нс<нна (<гце) и ложь (Ызе). В Рааса! и А«алогический тип данных рассматривается как встрое«иос в язык перечисление, а именно: <тве Зоо1еап - <<а!зе, <гне Ц Взтомобъявлепииопределеиы имена Га15е и Огне,атакжеихпорядокСа15е и <гне.
5.2. Скалярные типы данных 215 Наиболсс распространенными операциями с этим типом данных являются операции присваивая ия и следую>цие логические операции: агц: Воо1еап х Воо1еап к Воо1еап ти, логическое уииожекие) ог: Воо1еаг, х Воо1еап -> Воо1еап теклюкаюиее ИЛИ) по: Воо)еап -к Воо1еап тле икеское отрицание или Оулево дополнение) Иногда включаются и другие лоптческие операции: эквивалеьттностгк исключающее ИЛИ, имиликация, пап0 (пот-ап0), пег (пот. ог). Сакра>цснпая схема вычисления логических И и ИЛИ обсуждается в разделе 8.2. Реализация. Объекты логического тина представляются в памяти всего одним битом (если ис требуется наличие дескриптора, описывающего тии).
Поскольку часто получается так, что один бит в памяти не имеет свое) о отдельного адрсса, то лля представления логического объекта исиользуется слово или байт, то есть минимальная адресуемая область памяти. Тогда внутри такой области значения истина и ложь могут быть представлены двумя способами: + какой-то определенный бит внутри области иамяти (обычно тот же, который отвечает за злак в нрелставленив числа) используется для представления булеза значения (ложь = О, истина = 1), а остальные биты игнорируются; + значении> ложь отвечает заполнение всей области иамяти нулями, а любые другис комбинации битов в этой области соответствук>т значению исты а. Поскольку оба зти способа представления могут цотрсГ>ов пь большого обьема памяти, в языкс часто предусматривается специальный способ хранения цоследовательности битов.
Примерами подобного подхода могут служи.гь следующие типы данных: рнг>кот>ан>тый массие логически> значений (рас!тес! аггау о( Воо)еап) и множеса>г>а (зсг) в языке Рааса! и стронг> битов в Р1.,7!. В языке )ача логический тип определен явным образом вотличие от С, в котором для э~ого используются целые числа. Истина выражается л>обым ненулевым значением, а ложь соответствует нулевому значению, В принципе, такое определение порождает некоторыс ))роблсмы.
Например, в следующем фрагмент< программы на С: ,и' т1дви Пдч = 7. значение переменной 11а0 устанавливается равным 7, или 1" в двоичном представлении, Однако если вы захотитс инвертировать зна >ение нсремспной Г1ад посредством установки всех битов в его двои ~нолт представлении на противоположные значения, то получится... 111:000, то есть ио-прежнему значение будет истина.
7>т>алогично комбинирование значений таких исрсмсшп тх в одно с использованиемсм операции поразрядного логического ИЛИ (!) вместо операции лоптческого ИЛИ (! !) или операции поразрядно> о логического И (В) вместо операции логического И (ЬВ) приводит к таким жс цроГ>ломам, В азы кс С всегда болсс безопасно и падсжпо ттст>ол> зовттть щ)я црсдставлсшни логического значения истина цело числе>шую единицу и не ттьпаться уиаковать несколько булевых зцачсяий в одно многобитовос целое число. 5.2.4.
Символы Больтиицствт>дщшых вводится и выводится в символьной форме. Обычно эти данные затем преобразуются к друп>м тинам, но возможность обработки некоторых 216 Глава 5. Элементарные типы данных символьных лаипых в их исходной форме также весьма супгсствеииа. Послеловательпости символов (строки символов) обычно обрабатываются как елинос целое. Такой тип лап пых, как строки символов, может быть обеспечен или иепосрелствепио через тип данных строка символов, как зто сделано в языках М1. и Рго!оя, или при помощи символьного типа данных в виде одномерного массива символов, как это слелано в языках Рааса!, С и Аг(а.
Строки символов рассматриваются в разделе 5.3.1. Спецификация. Символьный тип данных прелоставляет возможность создания объектов лаииых, значениями которых люжет быть какой-либо елипствспиый символ. Множество возможных значений (то есть символов) обычно представляет собой встроенное в язык перечисление, соответствующее стаилартпым наборам символов, которые поллерживаются аппаратной частью компьютера (например, набор символов АЯСП), Порядок символов в этом наборе называется его схемой сортировки.
Схема сортировки играет существенную роль в операпиях отношения, так как опрслеляет алфавитный порядок лля строк символов, Поскольку в эту схему включены все символы, то можно упорядочивать строки, солержащис пробелы, точки и лругие специальные символы. Кроме операцийй отношения и прищщиваиия лля символьных данных иногда используются операции, которые позволяют определить припаплсжпость ланиого символа к какому-либо спепиальиому классу символов буква, цифра или специальный символ. Реализация. Символьный тип лапиых почти всегда поддерживается непосредственно аппаратной частью компьютера, так как объекты этого тина используются лля ввела-вывела.
Ипогла, однако, случается, что какой-либо конкретный набор символов (например, АЗСП), включенный в определение языка, нс поддерживается аппаратной частью конкретного компьютера. Хотя в обоих наборах могут содержаться одни и те же символы, способы их представления и, следовательно, схемы сортировки могут различаться; в Лругих случаях некоторые специальные символы могут присутствовать в олпом наборе символов и отсутствовать в лругом.
Поскольку символы, ввелеппые в компьютер через устройство паола-вывола, прелставлеиы в том вилс, который поддерживается аппаратурой лаииого компьютера, то в языке лолжпы быть прслусмотреиы способы преобразования в альтернативные представления либо обеспечена такая реализация операций отношения, в которой учитывается различие схем сортировки. Если же в языке используется тот же способ представления символов, что и в аппаратурес компьютера, то операции отношения обычно реализуются пепосрелствеиио через аппаратные или могут быть смолелированы простыми короткими встроенными послеловательпостями кола.
5.3. Составные типы данных Типы данных, которые мы рассматриваем в этом разделе, обычно относят к элементарным м типам па иных. Тем не меисс их реализация обычно полразуме пает оргн иизацию компилятором достаточно сложных структур. Такие типы данных характеризуются наличием нескольких атрибутов. В,З. Составныетипы данных 217 5.3.1. Строки символов Строка символов — это объект ланных, составленный из последовательности сим- волов.
В большинстве языков этот тип играет сушественную роль, в первую оче- редь при вводе и выводе информации. Спецификация и синтаксис. Можно указать по меньшей мере три различные интерпретации этого типа данных. 1. Строки фиксированной длины. Объект ланных строка символов может быть объявлен как имеюцпгй определенну>о фиксированную длину.
Значения, присваиваемые этому объекту, могут быть строками символов только этой длины. Присваивание этому объекту строки символов длины, отличной от определенной при его объявлении, приводит к ее усечению в случае, если ее длина больше определенной в объявлении, или к добавлению пробелов в ее конец, если ее длина меныпе определенной в объявлении объекта. 2. Строки переченной длины, не превосходящей заданного максимума.
В программе можно определить некоторую максимал>>гую длину строки, а фактические строки могут солержать меньшее количество символов или даже не содержать пх совсем (пустые строки), При выполнении программы длина строки может меняться, но если она увеличивается настолько, что становится больше максимальной, то лшпние символы отсекаются, 3. Неограниченные по длине строки, Объект данных такого типа может содержать строку любой длины, и зта длина может динамически меняться в процессе выполнения программы без каких-либо ограничений. В языке С ситуация несколько более сложная. В этом языке строки реализуют- ся как массивы символов, но для самих строк символов не прелусмотрено специ- ального типа.