Преобразования типов
Преобразование переменной одного типа в переменную другого типа является типизированием. mikroPascal PRO для ARM поддерживает как неявные, так и явные преобразования для встроенных типов.
Неявное преобразование
Компилятор обеспечит автоматическое неявное преобразование в следующих ситуациях:
- оператор требует выражения определенного типа (в соответствии с определением языка), и мы используем выражение другого типа,
- оператору требуется операнд определенного типа, и мы используем операнд разного типа,
- функция требует формального параметра определенного типа, и мы передаем ему объект другого типа,
- результат не соответствует объявленному возвращаемому типу функции.
Принцип преобразования
Когда операнды имеют разные типы, неявное преобразование способствует более сложному типу для более сложного типа, делая следующие шаги:
bit → byte/char byte/char → word short → integer short → longint integer → longint integer → real
Более высокие байты расширенного неподписанного операнда заполняются нулями. Более высокие байты расширенного подписанного операнда заполняются знаком бита (если число отрицательное, заполнять более высокие байты одним, иначе - нулями). Например:
var a : byte; b : word; ... a := $FF; b := a; // a is promoted to word, b becomes $00FF
Вырезка
В присваиваниях и операторах, для которых требуется выражение определенного типа, адресат будет хранить правильное значение только в том случае, если он может правильно представить результат выражения, т. е. если результат соответствует диапазону назначения.
Если выражение оценивается более сложным типом, чем ожидалось, избыток данных будет просто отсечен (высшие байты будут потеряны).
var i : byte; j : word; //... j := $FF0F; i := j; // i becomes $0F, higher byte $FF is lost
Явное преобразование
Явное преобразование может быть выполнено в любой момент, вставив ключевое слово типа (байт, слово, короткий, целочисленный, длинный или реальный) перед выражением, которое нужно преобразовать. Выражение должно быть заключено в круглые скобки. Явное преобразование может выполняться только с правом операнда оператора присваивания.
Особым случаем является преобразование между подписанными и неподписанными типами. Явное преобразование между подписанными и неподписанными данными не изменяет двоичное представление данных - оно просто позволяет копировать источник в пункт назначения.
Например:
var a : byte; b : short; ... b := -1; a := byte(b); // a is 255, not 1 // Это связано с тем, что двоичное представление остается // 11111111; теперь это просто интерпретируется по-другому
Вы не можете выполнить явное преобразование в операнде слева от оператора присваивания:
word(b) := a; // Компилятор сообщит об ошибке
Примеры преобразований
Вот пример преобразования:
program test; type TBytePtr = ^byte; var arr: array[10] of word; ptr : TBytePtr; var a, b, cc : byte; dd : word; begin a := 241; b := 128; cc := a + b; // equals 113 cc := word(a + b); // equals 113 dd := a + b; // equals 369 ptr := TBytePtr(@arr); ptr := ^byte(@arr); end.