в таблицах или порядковые номера
С другой стороны, индексы в таблицах или порядковые номера не требуют вычислений с разными типами: имеет смысл запросить следующий индекс в таблице, а не складывать индекс таблицы с порядковым номером. Для этих двух подходов к определению типов в языке Ada есть два разных средства.
Подтип (subtype) — это ограничение на существующий тип. Дискретные типы (целочисленные и перечисляемые) могут иметь ограничение диапазона.
subtype Temperatures is Integer range -273 .. 10000;
Temperature: Temperatures;
subtype Headings is Integer range 0 .. 359;
Compass_Heading: Headings;
Тип значения подтипа S тот же, что и тип исходного базового типа Т; здесь базовый как у Temperatures, так и у Headings — тип Integer. Тип определяется во время компиляции. Значение подтипа имеет то же самое представление, что и значение базового типа, и допустимо везде, где требуется значение базового типа:
Temperature * Compass_Heading
это допустимое выражение, но операторы:
Temperature := -280;
Compass-Heading := 365;
приводят к ошибке, потому что значения выходят за диапазоны подтипов. Нарушения диапазона подтипа выявляются во время выполнения.
Подтипы могут быть определены на любом типе, для которого его исходный диапазон может быть разумно ограничен:
subtype Upper-Case is Character range 'A'.. 'Z';
U: Upper-Case;
C: Character;
U := 'a'; -- Ошибка, выход за диапазон
С := U; -- Всегда правильно
U := С; -- Может привести к ошибке
Подтипы важны для определения массивов, как это будет рассмотрено в разделе 5.4. Кроме того, именованный подтип можно использовать для упрощения многих операторов:
if С in Upper-Case then ... - Проверка диапазона
for C1 in Upper-Case loop ... — Границы цикла
4.6. Производные типы
Вторая интерпретация отношения между двумя аналогичными типами состоит в том, что они представляют разные типы, которые не могут использоваться вместе.