Тип диапазон представляет собой подмножество величин порядкового типа (называемого базовым типом). Любая конструкция Low..High, где Low и High - постоянные выражения того же самого порядкового типа и Low меньше чем High, обозначает тип диапазон, который включает все величины между Low и High. Например, если
type
TColors = (Red, Blue, Green, Yellow, White, Black);
можно определить диапазон
type
TMyColors = Green..White;
Другие примеры:
type
SomeNumbers = -128..127;
Caps = 'A'..'Z';
Если для определения диапазона используются числовые или символьные константы, то этот тип можно указывать при описании переменной:
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.