Главная » Free Pascal » Операции над целочисленными данными Free Pascal

0

Арифметические операции

Кроме четырех обычных операций сложения (a+b), вычитания (a-b), умноже- ния (a*b) и деления (a/b) в языке Free Pascal предусмотрены целочисленное деле- ние (a div b) и нахождение остатка от деления (a mod b). Результат всех приве- денных выше операций над целочисленными операндами a и b, за исключением операции деления (a/b) является целочисленным. Операция обычного деления (a/b) всегда дает вещественный результат. Этим Паскаль отличается от многих ал- горитмических языков. При условии, что оба операнда принадлежат одному и тому же целочисленному типу, существует вероятность, что результат операции может оказаться за пределами границ, допустимых для данного типа. Если при работе компилятора включен контроль за выходом из допустимого интервала ({$R+}), то такая ситуация будет зафиксирована как ошибочная. Если такой контроль отклю- чен, то скажется эффект "кольца", упомянутый ранее. Следующий пример демон- стрирует обе ситуации (листинг 4.2).

   Листинг 4.2. Программа  range                                                

program range;

{$R-}

var

a:byte=255; b:byte=3; c:byte;

begin

c:=a+b; writeln(c); readln;

{$R+}

c:=a+b; readln;

end.

Первое сложение дает c=2. На втором сложении генерируется сообщение об ошибке (рис. 4.4).

Рис. 4.4. Сообщение о выходе за пределы допустимого диапазона

Поразрядные логические операции

Над целочисленными данными (обычно без знака) можно выполнять поразряд- ные (битовые) логические операции — логическое сложение (a or b), логическое умножение (a and b), исключающее "ИЛИ" (a xor b) и отрицание (not a). Приве- денная в листинге 4.3 программа дает представление о каждой из этих операций.

   Листинг 4 .3 .  Программа  Bool_op                                              

program Bool_op; var

a:byte=$C; b:byte=$A;

begin

writeln(‘a = ‘,a:9);

writeln(‘b = ‘,b:9);

writeln(‘a or b = ‘,(a or b):3);

writeln(‘a and b = ‘,(a and b):3);

writeln(‘a xor b = ‘,(a xor b):3);

writeln(‘not a  = ‘,(not a):3); readln;

end.

Результаты ее работы с комментариями, добавленными вручную, выглядят так:

a =       12   // Двоичный код = 00001100 b =       10   // Двоичный код = 00001010 a or b = 14   // Двоичный код = 00001110 a and b =  8   // Двоичный код = 00001000 a xor b = 6  // Двоичный код = 00000110 not a  = 243   // Двоичный код = 11110011

Операции сдвига

Целочисленный двоичный код x может быть сдвинут вправо (операция shr) или влево (операция shl) на n разрядов:

y := x shr n; z := x shl n;

Использовать эти операции надо осторожно. Дело в том, что операции сдвига разделяются на две категории — логический сдвиг (операнд x — число без знака) и арифметический сдвиг (операнд x — число со знаком). Сдвиг на n разрядов влево эквивалентен умножению x на 2, а сдвиг на n разрядов вправо — целочисленному

делению на

2. Когда число x отрицательно, оно представлено в дополнительном

коде и имеет в старших разрядах группу единиц, в том числе и в старшем (знако- вом) разряде. После сдвига вправо число должно остаться отрицательным. Поэтому при арифметическом сдвиге вправо знаковый разряд как бы раздваивается. Во- первых, он должен сдвинуться и, в то же время, остаться на своем месте. При логи- ческом сдвиге старший разряд числа не является знаковым, поэтому он просто сдвигается. Для более подробного знакомства со спецификой операций сдвига предлагается следующая программа (листинг 4.4).

   Листинг 4.4. Программа  shift                                                

program shift;

{$R-}

var

x:byte; y:shortint; j:integer;

begin

x:=8;

for j:=1 to 5 do

begin x:=x shl 1; write(x:6); end; writeln;

x:=8;

for j:=1 to 5 do

begin x:=x shr 1; write(x:6); end; writeln;

y:=-8;

for j:=1 to 5 do

begin y:=y shl 1; write(y:6); end; writeln;

y:=-8;

for j:=1 to 5 do

begin y:=y shr 1; write(y:6); end; readln;

end.

Результат ее работы:

Обратите внимание на тот факт, что при пятом сдвиге чисел влево происходит выход за пределы допустимого диапазона, поэтому в начале программы пришлось отключить контроль границ интервала. В противном случае программа была бы снята из-за ошибки. И еще одно — при сдвиге числа –1 вправо видимых изменений не происходит: единица, вылетающая за пределы младшего разряда, тотчас же компенсируется единицей, подбрасываемой из-за размножения знака.

Арифметические операции над вещественными числами

Над вещественными данными разрешены только четыре арифметические опе- рации — сложение (a+b), вычитание (a-b), умножение (a*b) и деление (a/b).

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии