Вот еще пример, где нет проверки
type
q=1..9;
begin
var a,b:q;
a:=4;
b:=3*a;
Writeln(b)
end.
Будет выдано правильное значение 4*3=12, хотя оно и недопустимо по диапазону.
Внешне кажется, что это ошибка компилятора или какой-то run-time библиотеки. Но давайте для начала заглянем в справку для диапазонного типа (type q=1…9 как раз диапазонный)…
Тип, на основе которого строится диапазонный тип, называется базовым для этого диапазонного типа. Значения диапазонного типа занимают в памяти столько же, сколько и значения соответствующего базового типа.
В PascalABC.NET запись целочисленной константы в виде целого числа означает, что для её хранения будет выбран тип integer, для которого отведено 4 байта. Следовательно, для переменных типа q будет также выделено 4 байта, в которые значение 12 безусловно поместится и переполнения не возникнет.
Можно попытаться возмутиться, что нет контроля выхода за границы диапазона 1…9.
Посмотрим, что пишется на эту тему в классической книге Йенсен К., Вирт Н. “Паскаль. Руководство для пользователя и описания языка” (кто не помнит, Н.Вирт - автор языка Паскаль).
2.2. Целый тип (integer)
Значениями целого типа являются являются элементы ЗАВИСЯЩЕГО ОТ РЕАЛИЗАЦИИ (выделено мной) подмножества целых чисел.
Там же, (в 5.2. Ограниченные типы), дается обоснование распространения свойств базового типа на диапазонный.
Иными словами, Н.Вирт отдает разрядность представления integer на откуп авторам реализации компилятора. Посему претензий по поводу отведения четырех байт в типе q быть не может.
Что касается контроля границ для диапазонных типов, Н. Вирт ничего специально об этом не говорил. Однако известно, что он был сторонником идеи строго контролировать все-все. К сожалению, соблюдение этого приводит к огромным накладным расходам в программе, делая её громоздкой, медленной и неэффективной по памяти.
Разработчики PascalABС.NET решили так: контролируется то, что может быть проконтролировано при компиляции. Т.е. попытка записать var x:q:=10; вызовет ошибку при компиляции. А вот присваивание некоторого значения при выполнении программы ошибки не вызовет.
Формально противоречия нет: описание разрядности переменной говорит лишь о том, в каком диапазоне должны быть данные, чтобы разместиться в такой переменной. И не более.