Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1std_PrT.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
200.19 Кб
Скачать

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.

ype

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;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]