5. Выражения
39
LONGWORD, используем необходимый тип для отдельных случаев. Пусть имеем
определения
var i, i1, i2: integer;
b, b1, b2: shortcard;
l, l1, l2: LongInt;
тогда следующие операторы - правильные:
i:= word(i1) and word(i2);
b:= byte(b1) and byte(b2);
l:= longword(l1) and longword(l2);
Следующий оператор - синтаксически и семантически правильный, но результат
ошибочный, т.е. он алгоритмически неправилен:
l:= word(l1) and word(l2);
Так как в случае происходит переопределение типа выражения, то значения l1 и
l2 сначала будут преобразованы из LONGINT в WORD (отбрасыванием старшего слова)
и тогда будет применена операция AND над словами, т.е. оператор эквивалентен
следующему:
 l:= (longword(l1) and $ffff) and (longword(l2) and $ffff);
2) Применение целых арифметических операций над операндами типа LONGINT
когда их тип не LONGINT. Например, i1 * i2 различается от LONGINT(i1 * i2), если i1 =
300, i2 = 1000.
Обычно, компилятор сам определяет как организовать вычисления в зависимости
от ожидаемого типа следующим образом:
*
если левый операнд выражения принадлежит типу LONGINT, вычисление
правого операнда выполняется при помощи LONGINT арифметических
операций;
*
при присваивании применяется аналогическим образом предыдущее
правило: если переменная, которой будет присвоено значение,
принадлежит типу LONGINT, вычисление выражения, выполняется при
помощи LONGINT арифметики;
*
передача фактических параметров-значений процедурам (функциям)
аналогична оператору присваивания; если формальный параметр типа
LONGINT, вычисления выполняются при помощи LONGINT арифметики;
*
если оба операнда целого типа и минимальный диапазон, включающий в
себя диапазоны обоих операндов, принадлежит типу LONGINT, то
вычисления выполняются при помощи LONGINT арифметики;
*
во всех остальных случаях, если не использовано явное переопределение
типа (Type Cast), целые операции выполняются при помощи INTEGER или
CARDINAL арифметики.
Ясно, что в некоторых случаях компилятор не сможет сам предпринять
правильное решение относительно типа используемых операций. Например, если i =
10, то оператор
i:= i1 * i2 div i;
при i1 = 300 и i2 = 1000 получит ошибочный результат. Так как вычисления будут выполняться
при помощи INTEGER арифметики, для этой цели необходимо явно указать на необходимость
в переопределении типа. Но результат выполнения оператора
<<  <  GO  >  >>

Вернуться к началу сайта