3.1.3. Переполнение при арифметических операциях

3.1.3. Переполнение при арифметических операциях

Переполнением принято называть ситуацию, когда при операциях над переменной результат выходит за пределы ее диапазона. Рассмотрим следующий пример (листинг 3.4, проект Overflow1 на компакт-диске).

Листинг 3.4. Переполнение при вычитании

procedure TForm1.Button1Click(Sender: TObject);

var X: Byte;

begin

 X:= 0;

 X:= X — 1;

 Label1.Caption:= IntToStr(X)

end;

Переменная X получит значение 255, поскольку при вычитании получается -1, что в беззнаковом формате соответствует 255. В принципе, этот пример практически эквивалентен примеру Assignment1, за исключением того, что значение -1 появляется в результате арифметических операций.

Немного изменим этот пример — заменим оператор вычитания функцией Dec (листинг 3.5, пример Overflow2 на компакт-диске).

Листинг 3.5. Переполнение при декременте

{$R+}

procedure TForm1.Button1Click(Sender: TObject);

var X: Byte;

begin

 X:= 0;

 Dec(X);

 Label1.Caption:= IntToStr(X);

end;

Результат получается тот же (X получает значение 255), но обратите внимание: несмотря на то, что опция Range checking включена, исключение не возникает. Этим пример Overflow2 отличается от Overflow1 — там исключение возникнет. Связано это с тем, что переполнение при использовании Dec и подобных ей функций контролируется другой опцией — Overflow checking (в коде программы включается директивой {$Q+} или {$OVERFLOWCHECKS ON}). Эта опция по умолчанию тоже отключена и ее также рекомендуется включать при отладке. При ее включении в данном примере возникнет исключение EIntOverflow.

Данный текст является ознакомительным фрагментом.