Для переменной перечислимого типа выделяется один байт (ограничение - 256), в который записывается порядковый номер присваиваемого значения. Порядковый номер определяется из описанного типа, причём нумерация начинается с 0. Имена из списка перечислимого типа являются константами, например,
var
B,С: color;
begin
B:=bluе; // B=1
C:=green; // С=2
Write(ord(B):4,ord(C):4);
end.
После выполнения данного фрагмента программы на экран будут выданы цифры 1 и 2. Содержимое памяти для переменных B и C при этом следующее: В - 00000001; С - 00000010.
На физическом уровне над переменными перечислимого типа определены операции создания, уничтожения, выбора, обновления. При этом выполняется определение порядкового номера идентификатора по его значению и, наоборот, по номеру идентификатора его значение.
На логическом уровне переменные перечислимого типа могут быть использованы только:
· в выражениях булевского типа;
· в операциях сравнения;
При этом сравниваются порядковые номера значений.
Тип диапазон представляет собой подмножество величин порядкового типа (называемого базовым типом). Любая конструкция Low..High, где Low и High - постоянные выражения того же самого порядкового типа и Low меньше чем High, обозначает тип диапазон, который включает все величины между Low и High. Например, если
Если для определения диапазона используются числовые или символьные константы, то этот тип можно указывать при описании переменной:
var
SomeNum: 1..500;
Порядковый номер каждой величины диапазона берется из базового типа.
Следующий пример вызовет ошибку:
type
Percentile = 0..99;
var
I: Percentile;
...
I := 100;
Использование постоянных выражений в определении диапазона приводит к синтаксическим проблемам. В любой декларации типа, когда первый значимый символ после «=» - левая скобка, компилятор считает, что определяется перечислимый тип. Следовательно, код
const X = 50; Y = 10;
type Scale = (X - Y) * 2..(X + Y) * 2;
Приведет к ошибке. Необходимо определить тип несколько иначе:
type Scale = 2 * (X - Y)..(X + Y) * 2;
Один из способов образования новых типов из уже существующих - ограничение допустимого диапазона значений некоторого стандартного скалярного типа или рамок описанного перечислимого типа. Это ограничение определяется заданием минимального и максимального значений диапазона. При этом изменяется диапазон допустимых значений по отношению к базовому типу, но представление в памяти полностью соответствует базовому типу.
Данные интервального типа могут храниться в зависимости от верхней и нижней границ интервала независимо от входящего в этот предел количества значений в виде, представленном в таблице 2.4. Для данных интервального типа требуется память размером один, два или четыре байта, например,
var
A: 220..250; // Занимает 1 байт
В: 2221..2226; // Занимает 2 байта
C: 'A'..'K'; // Занимает 1 байт
begin
A:=240; C:='C'; B:=2222;
end.
После выполнения данной программы содержимое памяти будет следующим:
A - 11110000; C - 01000011; B - 10101110 00001000.