Typecast/ru

From Free Pascal wiki
Jump to navigationJump to search

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 явный
  • trunc отсекает дробную часть
  • round округляет дробную часть
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 явный
  • 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)

Предостережение

  • Явное приведение типов отключает проверку диапазона в полной строке кода.

См.также