5. Изрази
37
l:= (longword(l1) and $ffff) and (longword(l2) and $ffff);
Друг случай, когато се използва преопределянето на типа на израз, е явно да се
укаже целочислените операции да се извършват над типа LongInt. Например i1 * i1 е
различно от 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 аритметика. За целта трябва явно да се укаже преобразуването на типа. Докато
оператора
l:= i1 * i2 div i;
ще даде верен резултат, тъй като очакван тип е LONGINT.
<<  <  GO  >  >>

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