Артур, в Project Oberon и в Обероне-07 только один целочисленный тип для операций — это INTEGER. BYTE просто промежуточная форма для хранения значений. Поэтому ограничивать специально ёмкость беззнаковых шестнадцатеричных литералов и не стали, неявно приводя их к знаковым. Здесь плохо то, что знак получается скрытым.
Если есть другие целые типы (LONGINT, например), то всё несколько усложняется. Я бы вынес знак из маски шестнадцатеричного числа и писал бы DWord(90909090H - 100000000H). Это будет хорошо работать в рамках модели с несколькими целочисленными типами.
С интересом выслушаю, почему знак в шестнадцатеричных литералах должен быть задан разрядом. Но тебе здесь не подскажут никакого разумного ответа, зачем это надо оставить. Разве что взять заклеить себе жвачкой глаза и сделать вид, что 64-битных чисел не существует. Или сделать вид, что при существовании 64-битных чисел не существует 32-битных. Короче, молиться богу Оберона-07.
P.S. Ответ "потому, что иначе самое большое шестнадцатеричное число 0FFFFFFFFFFFFFFFFH и не задашь литералом без знака" не прокатывает. Это проблема, но разумного решения у неё нет. Только в виде полумер: всё равно разрешить. А просто потому что потому.
И ещё: почему задавать знак разрядом в десятичных литералах нельзя:
Код:
CONST a = 4294967295; (* где подразумеваем, что это 32-битная константа со знаком *)
, что правильно, а в шестнадцатеричных должно быть можно? Где здесь логика?
Проблема несколько смягчается, если при задании константы можно задавать и её тип. Но это усложнение и тоже полумера. Раз мы отказались от беззнаковых типов вместе с переходом на Обероны, то остаётся только этому радоваться. Упрощение жеж