> -- Dave Brown писал(а):
> Как в VOC, так и в Oberon 2013 целочисленные литералы анализируются в анализаторе символов (VOC: OPS.Mod или 2013: ORS.MOD) и хранятся в таблице символов в виде целочисленных значений со знаком.Позже, во время компиляции выражений, их размер определяется величиной их целочисленного значения со знаком.Разница между Oberon 2013 и VOC - это самый большой целочисленный тип, который составляет 32 бита в Oberon 2013 и 64 бита в VOC.Специальная обработка, которая позволяет шестнадцатеричному литералу с верхним разрядным набором рассматриваться как знаковое значение, происходит в то время, когда литерал анализируется как символ, независимо от того, в каком контексте он используется. (Рассмотрим, например, 'CONST mask = 90909090H' - анализ CONST не знает, будет ли эта константа использоваться в 64-битном, 32-битном, 16-битном или другом контексте.)VOC и Oberon 2013 допускают поведение синтаксического анализа верхнего набора битов шестнадцатеричного специального случая, разница заключается в размере целочисленного литерала.Таким образом, VOC принимает myint64 := 909090909090909090H, поскольку 909090909090909090H анализируется как отрицательное 64-битное целое число со знаком.Но VOC не принимает myint32 := 90909090H, потому что 9090909090H анализируется как положительное 64-битное целое число со знаком.VOC не имеет возможности распознать 90909090H как отрицательное 32-разрядное целое число со знаком.- Я действительно хотел добавить еще одну букву суффикса, чтобы указать предполагаемый размер, но я не мог убедиться, что любое решение было достаточно простым, чтобы его было легко понять.- Обратите внимание, что это не зависит от настройки совместимости VOC -Ox: это устанавливает целочисленный размер по умолчанию, а не целочисленный размер литерала - целочисленные литералы всегда поддерживают самый большой доступный целочисленный размер, который является SYSTEM.INT64, он же HUGEINT.)-- Дейв