
- •1.1. Цель работы.
- •1.2. Задание на подготовку к лабораторной работе.
- •1.3. Порядок выполнения работы.
- •1.4. Варианты заданий и условия задач.
- •1.5. Вопросы для самопроверки.
- •1.6. Методические указания.
- •1.6.1 Машинное представление целочисленных типов данных.
- •1.6.2 Машинное представление вещественных типов данных.
- •1.6.3 Машинное представление символьных типов данных.
- •1.6.4 Машинное представление логических (булевских) типов данных.
- •1.6.5 Машинное представление скалярных типов данных.
1.6.4 Машинное представление логических (булевских) типов данных.
Существует 4 предопределенных булевских типа: Boolean, ByteBool, WordBool и LongBool. Значения булевского типа обозначаются встроенными идентификаторами констант False и True. Поскольку булевский тип является перечислимым, между этими значениями имеют место следующие отношения:
- False < True
- Ord(False) = 0
- Ord(True) = 1
- Succ(False) = True
- Pred(True) = False
Значения и переменные булевского типа Boolean хранятся как байт, WordBool - как слово, а LongBool - как значение Longint. При этом подразумеваются, что они могут принимать значения 0 (Falsе) или 1 (Тruе).
Переменные типа Boolean и ByteBool занимают 1 байт, переменная WordBool занимает два байта (слово), а переменная LongBool занимает четыре байта (два слова). Boolean - это наиболее предпочтительный тип, использующей меньше памяти; типа ByteBool, WordBool и LongBool обеспечивают совместимость с другими языками и средой Windows.
Предполагается, что переменная типа Boolean имеет порядковые значения 0 и 1, но переменные типа ByteBool, WordBool и LongBool могут иметь другие порядковые значения. Когда выражение типа ByteBool, WordBool или LongBool равна 1, то подразумевается, что она имеет значение True, а если оно равно 0 - то False. Когда значение типа ByteBool, WordBool или LongBool используется в контексте, где ожидается значение Boolean, компилятор будет автоматически генерировать код, преобразующий любое ненулевое значение в значение True.
1.6.5 Машинное представление скалярных типов данных.
Скалярные типы данных включают в себя перечислимые и ограниченные (диапазон) типы данных.
Перечислимые типы определяют упорядоченные множества значений через перечисление идентификаторов, которые обозначают эти значения. Упорядочение множеств выполняется в соответствии с последовательностью, в которой перечисляются идентификаторы.
При указании идентификатора в списке идентификаторов перечислимого типа он описывается как константа для блока, в котором указано описание перечислимого типа. Типом этой константы является описанный перечислимый тип:
Type
T = (C1, C2, ……CN);
где T - идентификатор нового типа;
Ci - идентификаторы новых констант.
Мощность множества T (обозначается card - кардинальное число): card(T)=n.
Например:
t
Var
man
: brigada; ……………….. BEGIN ……………….. man
:= Popov; ……………….. END.
operator = (plus, minus, mult, divide);
brigada = (Petrov, Sidorov, Ivanov, Belov, Popov);
color = (red, green, yellow, blue);
pol = (male, female);
Согласно этому описанию, minus является константой типа operator.
Определение приведенное здесь эквивалентно man := 4, но более информативно.
Значения перечислимого типа хранятся, как байт без знака, если нумерация не превышает 256. В противном случае они хранятся, как слово без знака. Важно, в каком порядке перечислены идентификаторы типа, так как порядковый номер перечислимой константы определяется ее позицией в списке идентификаторов при описании. Перечислимый тип, в котором описывается константа, становится ее типом. Первая перечислимая константа в списке имеет порядковый номер 0, вторая - 1 и т. п. (в TP 7.0). Один и тот же идентификатор можно использовать в определении только одного перечисляемого типа.
Выражения и константы, перечисляемого типа в TP 7.0 допустимы для использования в операторе CASE. Операции отношения и логические операции допустимы для перечисления одного и того же типа. Так как упорядочение осуществляется по номеру элемента в описании типа, то допустимы операции сравнения. Например, в описанном выше примере mult > plus, так как фактически plus=0, а mult=2.
Для работы с перечисляемыми типами в TP 7.0 используются следующие стандартные функции:
Succ(x) - получение следующего за x в списке значения;
Pred(x) - получение предыдущего для x в списке значения;
Ord(x) - возвращает порядковый номер x во множестве значений;
При применении функции Ord к значению перечислимого типа, возвращается целое число, которое показывает, какое положение занимает это значение в отношении других значений этого перечислимого типа. Для приведенного выше описания, Ord(plus) вернет 0, Ord(minus) вернет 1, Ord(mult) вернет 2 и так далее. Аналогично Succ(mult) = 3; Pred(mult)=1.
Операторы
write(ln) и read(ln), а также арифметические
операции неприменимы к перечислимым
типам, однако применяя искусственные
приемы м
……………….. {$R+} op1
:= minus; writeln(Ord(op1)); …………………….
Ограниченный тип данных (диапазон). Часто приходится сталкиваться с положением, когда переменной присваивается значение некоторого типа, лежащее только внутри определенного интервала значений. Такое положение можно подчеркнуть, определив, что указанная переменная относится к ограниченному типу данных (диапазону). Иногда можно встретить название интервальный тип или отрезок типа.
Определение такого типа включает наименьшее и наибольшее значение в поддиапазоне которого порядкового типа, называемого главным (или базовым) типом. Такой тип описывается следующим образом:
Type
T = min..max;
где min и max - выражения, определяющие концы такого диапазона, причем, необходимо, что бы min max;
Операндами выражения могут быть только константы, которые должны иметь один и тот же порядковый тип. Операнды разделяются знаком ".." (две точки).
Например:
Type
Year = 1900..1999;
Letter = 'A'..'Z';
Digit = '0'..'9';
Index = 0..2*N-1;
Hours = 1..24;
Переменная такого типа имеет все свойства переменных главного типа, однако ее значение на этапе выполнения должно принадлежать указанному интервалу (диапазону).
Например, если для вышеуказанных типов объявлены переменные:
Var
God : Year;
Bukva : Letter;
то допустимы присваивания God:=1998; и Bukva := 'Q'; и не допустимы God:=1298; и Bukva := 'q';.
Возможно задание ограниченного типа в виде констант:
Const
Min = 1;
Max = 31;
Type
Dni_M = Min..Max;
Var
RabDni, VihDni: Dni_M;
Разрешение использования выражений-констант там, где стандартный Паскаль допускает только простые константы, приводит к некоторой синтаксической неоднозначности. Рассмотрим следующие описания:
Const
X = 50;
Y = 10;
Type
Color = (Red, Green, Blue);
Scale = (X - Y) * 2..(X + Y) * 2;
Согласно синтаксису стандартного Паскаля, если определение типа начинается с круглой скобки, то это перечислимый тип (такой как Color в данном примере). Однако Scale предназначен для определения отрезка типа. Решение состоит в том, чтобы переупорядочить первое выражение поддиапазона или задать другую константу, равную значению данного выражения, и использовать эту константу в определении типа:
type
Scale = 2 * (X - Y)..(X + Y) * 2;