Object Pascal является сильно типизированным языком. Это означает, что типы данных строго различаются и при вычислении выражений строго выполняются определенные правила и ограничения на использование различных типов. Преимущество сильной типизации состоит в том, что транслятор получает возможность правильно обрабатывать данные и тщательно проверять исходный код, исключая таким образом труднодиагностируемые ошибки времени выполнения. Чтобы лучше понять принципы сильной типизации, выполните следующий фрагмент кода:
var
myChar: Char;
myByte: Byte;
begin
myChar := 'A';
myByte := myChar; {Строка с синтаксической ошибкой!}
end;
Переменные обоих типов (Char и Byte) для хранения своих значений занимают по одному байту памяти. Компилятор генерирует сообщение об ошибке потому, что согласно правилам сильной типизации Object Pascal нельзя присваивать значение типа Char переменной типа Byte и наоборот.
Однако иногда в программе необходимо выполнить операцию, запрещенную правами сильной типизации, как в предыдущем примере. В этом случае обойти правила сильной типизации можно с помощью механизма приведения типов. Приведением типов называется преобразование типов промежуточных результатов вычислений. Обратите внимание: преобразуются только типы промежуточных результатов, типы объявленных переменных всегда остаются неизменными. Общий синтаксис приведения типов имеет вид
тип_данных (выражение);
Например, оператор Integer('А') приводит тип символа А к целому. Значение любой переменной можно привести к любому типу при условии, что исходный и результирующий типы занимают одинаковый объем памяти и не смешиваются целые и вещественные числа.
Теперь можно исправить наш предыдущий пример следующим образом:
Операция приведения типов не преобразует типы значений между вещественными и целыми числами. Однако это можно сделать с помощью встроенных процедур и функций преобразования типов Object Pascal, перечисленных в таблице 7.
Таблица 7 – Процедуры и функции преобразования типов
Функция/Процедура
Назначение
CompToCurrency(Value: Comp): Currency;
Преобразует значение Comp в значение Currency
CompToDouble(Value: Comp): Double;
Преобразует значение Comp в значение Double
CurrencyToComp(Value: Currency; var Result: Comp);
Преобразует значение Currency в значение Comp
DoubleToComp(Value: Double; var Result: Comp);
Преобразует значение Double в значение Comp
Int(X: Extended): Extended;
Возвращает целую часть вещественного значения
Round(X: Extended): Int64;
Округление значения x до ближайшего целого значения Int64. Если x находится точно между двумя целыми, то результат всегда является четным числом
Trunc(X: Extended): Int64;
Усекает вещественное значение до целого (отбрасывает дробную часть)
Chr(X: Byte): Char;
Возвращает символ с порядковым значением X (ASCII)
Выражения, в которых операнды имеют разные числовые типы данных, называются смешанными арифметическими выражениями. Их использование в Object Pascal допускается. Например, следующий фрагмент кода не содержит ошибки:
var
numl, result: Real;
num2: Integer;
begin
numl := 7.2;
num2 :=3;
result := numl * num2; {Смешанное арифметическое выражение}
end;
В предыдущем коде num1 является вещественным числом, a num2 – целым. Таким образом, numl * num2 является смешанным арифметическим выражением. Из табл. 7 видно, что для явного преобразования целого типа в вещественный никакой встроенной процедуры нет. Такие процедуры и не нужны, потому что в Object Pascal числовые типы, требующие меньшей памяти, автоматически продвигаются к типам, требующим большей памяти, а целые типы продвигаются к вещественным. Другими словами, преобразование целого типа в вещественный выполняется неявно. Неявное приведение типов данных можно отключить, если указать директиву компилятора {$R+}, которая принуждает компилятор всегда проверять границы и диапазоны.