Да, и коль уж заговорили о переполнениях, выскажу старую свою мысль: система типов и у Оберона и у прочих современных ЯП (типа той же java например, да и плюсов и haskell'я) - дырявая. У строго типизированных она почему-то запрещает например преобразование real->int, но при этом разрешает int+int. А ведь и то и другое может привести к одному и тому же - к переполнению/порче значения.
Пусть у нас есть тип Int(N), где N - битность этого целочисленного типа. Тогда, очевидно в случае сложения двух чисел этого типа результат не будет иметь тип Int(N), он будет иметь тип Int(N+1).
Int(N)+Int(M) = Int(Max(N,M)+1)
Int(N)*Int(M) = Int(N+M)
Поправьте если где-то ошибся.
Далее - есть тип представления числа (сколько он там в памяти машины места занимает) и логический тип (какое множество значений по смыслу программы валидно). Это разные штуки, и не надо их смешивать. Если в языке одно от другого отделено, то это позволяет в ряде случаев выполнять рантайм проверку только когда логический вычисленный (по правилам приведенным выше) тип становится больше машинного (производится автоматическое приведение к логическому типу с проверкой).
Либо требовать рукотворного явного приведения типов. Типа a,b,c,d : int_4; a:=int_4(a+b+c+d); Только программировать в таком стиле будет не слишком удобно.