Len писал(а):
Скажите, а почему компилятор понижает разряды, если написать так:
Код: "OBERON"
i5: LONGINT;
i5 := 16 * 512 * i3;
StdLog.Int(i5);
?
Как-то странно: если числа ввести константами, то не понижает...
Len, достаточно знать, что в языке КП по умолчанию целочисленная арифметика является 32-битной (тип INTEGER). Всегда. Кроме тех случаев, когда явно указать компилятору, что нужно перейти к LONGINT.
В выражении i5 := 16 * 512 * i3 переменная i5 конечно типа LONGINT, но такая переменная принимает результат вычислений типа INTEGER тоже. Что и имеет место в данном случае.
Приводить константу 16 или 512 к LONGINT нет смысла. Надо приводить переменную i3, притом _перед_ вычислением, а не после него. И тогда компилятор будет работать в диапазоне уже не INTEGER, как это он делает по умолчанию, а LONGINT, как указал ему программист. Вроде всё просто. У меня с этим никогда не было проблем.