Typecast/ru
Deutsch · English · Français · Русский
Typecasting(приведение типов) - это концепция, позволяющая присваивать значения переменных или выражений, которые не соответствуют типу данных, переменной, фактически перекрывая систему строгой типизации Pascal.
Определение
Различают два варианта приведения типов:
Неявное приведение типов
Если полный диапазон значений, которые может иметь источник, может быть сохранен целевым операндом, происходит автоматическая - то есть «неявная» - передача типа. Например, все значения типа byte могут быть сохранены в int64. Присвоение значения типа byte для int64 работает без проблем, поскольку пропущенные нулевые биты заполняются автоматически, то есть неявно. Программист не должен вставлять дополнительный код.
Прим.перев.: иными словами, преобразование переменных с меньшим диапазоном значений в переменные с большим диапазоном значений происходит автоматически (неявное преобразование).
Явное приведение типов
Если диапазон значений источника не вписывается в диапазон целевого операнда, компилятор не скомпилирует программу, если ему не дано [указаний явно] игнорировать это.
Прим.перев.: иначе говоря, преобразование переменных с большим диапазоном значений в переменные с меньшим диапазоном значений осуществляется с помощью явного преобразования путем вызова соответствующей функции. И если значение переменной-источника не соответствует поддерживаемому диапазону значений переменной-приемника, то произойдет потеря данных.
Существует два разных варианта явного приведения типа:
Value typecasts (приведение типа для значения)
Преобразование типов осуществляется путем добавления идентификатора типа данных и заключения выражения для преобразования типов в круглые скобки, например: dataType(expression). Лишние биты просто отбрасываются. Этот подход обычно используется, если есть абсолютная уверенность, что фактическое значение expression будет соответствовать ожидаемому. Иногда этот эффект также используется вместо применения оператора Mod.
Variable typecasts (приведение типа для переменной)
Такое приведение типа обрабатывает переменную, как если бы это был другой тип. Извлечение и сохранение переменной выполняется, как если бы это был указанный тип данных. Так же, как и в случае приведения типа для значения, перед типом данных добавляется идентификатор типа, а в этом случае круглые скобки окружают идентификатор переменной: dataTypeIdentifier(variableIdentifier). В отличие от приведения типа для значения, приведения типа для переменной может происходить с обеих сторон присваивания.
Преобразование в сравнении с приведением типов
Преобразование типов - это упорядоченный процесс отображения значений домена в совместный домен, что может привести к возникновению исключений или ошибок времени выполнения. Это делается с помощью правильно определенных функций. Простое приведение типов, с другой стороны, это всегда грубая сила. Оно обрезает и заталкивает биты 1:1 адресату. Однако вы можете задать перегрузку оператора, переопределяя это поведение.
В некоторых случаях вы можете конвертировать значения:
возможности конверсии
исходный тип данных
конечный тип данных
вариант преобразования типа
метод
неявный
оператор присваивания
real
integer
явный
integer
явный
real
string
явный
string
integer
явный
string
real
явный
string
явный
stringVariable[indexExpression]
char/ANSIChar/wideChar
string
неявный
оператор присваивания
char/ANSIChar
byte
явный
- ord
byte(characterVariableOrExpression)
byte
char/ANSIChar
явный
- chr
ANSIChar(byteVariableOrExpression)
перечислимый тип
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
- § “
unalignedtypecasts” в справочном руководстве FreePascal - Перегрузка операторов (особая группа операторов присваивания и § «маршрутизация»)
From the Free Pascal wiki, page "Typecast/ru", as it stood on 2022-08-06 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.
Talk about this page
Nobody has opened a bench for this page yet. Sign in to open one.
