Typecast/ru
│
Deutsch (de) │
English (en) │
français (fr) │
русский (ru) │
Typecasting(приведение типов) - это концепция, позволяющая присваивать значения переменных или выражений, которые не соответствуют типу данных, переменной, фактически перекрывая систему строгой типизации Pascal.
Определение
Различают два варианта приведения типов:
Неявное приведение типов
Если полный диапазон значений, которые может иметь источник, может быть сохранен целевым операндом, происходит автоматическая - то есть «неявная» - передача типа. Например, все значения типа byte
могут быть сохранены в int64
. Присвоение значения типа byte
для int64 работает без проблем, поскольку пропущенные нулевые биты заполняются автоматически, то есть неявно.
Программист не должен вставлять дополнительный код.
Прим.перев.: иными словами, преобразование переменных с меньшим диапазоном значений в переменные с большим диапазоном значений происходит автоматически (неявное преобразование).
Явное приведение типов
Если диапазон значений источника не вписывается в диапазон целевого операнда, компилятор не скомпилирует программу, если ему не дано [указаний явно] игнорировать это.
Прим.перев.: иначе говоря, преобразование переменных с большим диапазоном значений в переменные с меньшим диапазоном значений осуществляется с помощью явного преобразования путем вызова соответствующей функции. И если значение переменной-источника не соответствует поддерживаемому диапазону значений переменной-приемника, то произойдет потеря данных.
Существует два разных варианта явного приведения типа:
Value typecasts (приведение типа для значения)
Преобразование типов осуществляется путем добавления идентификатора типа данных и заключения выражения для преобразования типов в круглые скобки, например: dataType(expression)
.
Лишние биты просто отбрасываются.
Этот подход обычно используется, если есть абсолютная уверенность, что фактическое значение expression
будет соответствовать ожидаемому.
Иногда этот эффект также используется вместо применения оператора Mod.
Variable typecasts (приведение типа для переменной)
Такое приведение типа обрабатывает переменную, как если бы это был другой тип.
Извлечение и сохранение переменной выполняется, как если бы это был указанный тип данных.
Так же, как и в случае приведения типа для значения, перед типом данных добавляется идентификатор типа, а в этом случае круглые скобки окружают идентификатор переменной:
dataTypeIdentifier(variableIdentifier)
.
В отличие от приведения типа для значения, приведения типа для переменной может происходить с обеих сторон присваивания.
Преобразование в сравнении с приведением типов
Преобразование типов - это упорядоченный процесс отображения значений домена в совместный домен, что может привести к возникновению исключений или ошибок времени выполнения. Это делается с помощью правильно определенных функций. Простое приведение типов, с другой стороны, это всегда грубая сила. Оно обрезает и заталкивает биты 1:1 адресату. Однако вы можете задать перегрузку оператора, переопределяя это поведение.
В некоторых случаях вы можете конвертировать значения:
исходный тип данных | конечный тип данных | вариант преобразования типа | метод |
---|---|---|---|
integer
|
real
|
неявный | оператор присваивания |
real
|
integer
|
явный | |
integer
|
string
|
явный | sysUtils.intToStr
|
real
|
string
|
явный | |
string
|
integer
|
явный | sysUtils.strToInt
|
string
|
real
|
явный | sysUtils.strToFloat
|
string
|
char
|
явный | stringVariable[indexExpression]
|
char /ANSIChar /wideChar
|
string
|
неявный | оператор присваивания |
char /ANSIChar
|
byte
|
явный |
|
byte
|
char /ANSIChar
|
явный |
|
перечислимый тип | string
|
явный | system.writeStr (stringVariable, enumeratedVariableOrExpression)
|
В других случаях вы должны вручную выполнить явное приведение типов:
исходный тип данных | конечный тип данных | вариант преобразования типов | метод |
---|---|---|---|
qWord
|
byte
|
явный | byte(qWordVariableOrExpression)
|
qWord
|
word
|
явный | word(qWordVariableOrExpression)
|
qWord
|
cardinal
|
явный | cardinal(qWordVariableOrExpression)
|
qWord
|
longWord
|
явный | longWord(qWordVariableOrExpression)
|
longWord
|
byte
|
явный | byte(longWordVariableOrExpression)
|
longWord
|
word
|
явный | word(longWordVariableOrExpression)
|
longWord
|
cardinal
|
неявный | оператор присваивания |
int64
|
byte
|
явный | byte(int64variableOrExpression)
|
int64
|
shortInt
|
явный | shortInt(int64variableOrExpression)
|
comp
|
byte
|
явный | byte(compVariableOrExpression)
|
comp
|
shortInt
|
явный | shortInt(compVariableOrExpression)
|
comp
|
real
|
явный | real(compVariableOrExpression)
|
Предостережение
- Явное приведение типов отключает проверку диапазона в полной строке кода.
См.также
- «Кастинг типов (компьютерное программирование)» в русской Википедии
- § “value typecasts” в справочном руководстве FreePascal
- § “variable typecasts” в справочном руководстве FreePascal
- § “
unaligned
typecasts” в справочном руководстве FreePascal - Перегрузка операторов (особая группа операторов присваивания и § «маршрутизация»)