Sign in Join
Wiki copytemporary

Typecast/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Typecast/ru

OldNewLine
1+Typecasting(приведение типов) - это концепция, позволяющая [[Becomes/ru|присваивать]] значения [[Variable/ru|переменных]] или выражений, которые не соответствуют [[Data type/ru|типу данных]], переменной, фактически перекрывая систему строгой типизации [[Pascal]].
2+
3+## Определение
4+
5+Различают два варианта приведения типов:
6+
7+### Неявное приведение типов
8+
9+Если полный диапазон значений, которые может иметь источник, может быть сохранен целевым операндом, происходит автоматическая - то есть «неявная» - передача типа. Например, все значения типа [[Byte/ru|byte]] могут быть сохранены в `int64`. Присвоение значения типа `byte` для `int64` работает без проблем, поскольку пропущенные [нулевые биты](https://ru.wikipedia.org/wiki/%D0%91%D0%B8%D1%82%D0%BE%D0%B2%D0%BE%D0%B5_%D0%BF%D0%BE%D0%BB%D0%B5) заполняются автоматически, то есть неявно. Программист не должен вставлять дополнительный код.
10+
11+------------------------------------------------------------------------
12+
13+Прим.перев.: иными словами, преобразование переменных с меньшим диапазоном значений в переменные с большим диапазоном значений происходит автоматически (неявное преобразование).
14+
15+------------------------------------------------------------------------
16+
17+### Явное приведение типов
18+
19+Если диапазон значений источника не вписывается в диапазон целевого операнда, [[FPC/ru|компилятор]] не скомпилирует программу, если ему не дано \[указаний явно\] игнорировать это.
20+
21+------------------------------------------------------------------------
22+
23+Прим.перев.: иначе говоря, преобразование переменных с большим диапазоном значений в переменные с меньшим диапазоном значений осуществляется с помощью явного преобразования путем вызова соответствующей функции. И если значение переменной-источника не соответствует поддерживаемому диапазону значений переменной-приемника, то произойдет потеря данных.
24+
25+------------------------------------------------------------------------
26+
27+Существует два разных варианта явного приведения типа:
28+
29+#### Value typecasts (приведение типа для значения)
30+
31+Преобразование типов осуществляется путем добавления идентификатора типа данных и заключения выражения для преобразования типов в круглые скобки, например: `dataType(expression)`. Лишние биты просто отбрасываются. Этот подход обычно используется, если есть абсолютная уверенность, что фактическое значение `expression` будет соответствовать ожидаемому. Иногда этот эффект также используется вместо применения оператора [[Mod]].
32+
33+#### Variable typecasts (приведение типа для переменной)
34+
35+Такое приведение типа обрабатывает переменную, как если бы это был другой тип. Извлечение и сохранение переменной выполняется, как если бы это был указанный тип данных. Так же, как и в случае приведения типа для значения, перед типом данных добавляется идентификатор типа, а в этом случае круглые скобки окружают идентификатор переменной: `dataTypeIdentifier(variableIdentifier)`. В отличие от приведения типа для значения, приведения типа для переменной может происходить с обеих сторон присваивания.
36+
37+## Преобразование в сравнении с приведением типов
38+
39+Преобразование типов - это упорядоченный процесс отображения значений домена в совместный домен, что может привести к возникновению [[Exceptions|исключений]] или [[runtime error|ошибок времени выполнения]]. Это делается с помощью правильно определенных [[Function/ru|функций]]. Простое приведение типов, с другой стороны, это всегда грубая сила. Оно обрезает и заталкивает биты 1:1 адресату. Однако вы можете задать [[Operator overloading|перегрузку оператора]], переопределяя это поведение.
40+
41+В некоторых случаях вы можете конвертировать значения:
42+
43+возможности конверсии
44+
45+**исходный тип данных**
46+
47+**конечный тип данных**
48+
49+**вариант преобразования типа**
50+
51+**метод**
52+
53+[[Integer|integer]]
54+
55+[[Real|real]]
56+
57+неявный
58+
59+оператор присваивания
60+
61+`real`
62+
63+`integer`
64+
65+явный
66+
67+- [[Trunc|trunc]] отсекает дробную часть
68+- [[Round|round]] округляет дробную часть
69+
70+`integer`
71+
72+[[String|string]]
73+
74+явный
75+
76+[`sysUtils.intToStr`](https://www.freepascal.org/docs-html/rtl/sysutils/inttostr.html)
77+
78+`real`
79+
80+`string`
81+
82+явный
83+
84+- [`sysUtils.floatToStr`](https://www.freepascal.org/docs-html/rtl/sysutils/floattostr.html)
85+- [`sysUtils.floatToStrF`](https://www.freepascal.org/docs-html/rtl/sysutils/floattostrf.html)
86+
87+`string`
88+
89+`integer`
90+
91+явный
92+
93+[`sysUtils.strToInt`](https://www.freepascal.org/docs-html/rtl/sysutils/strtoint.html)
94+
95+`string`
96+
97+`real`
98+
99+явный
100+
101+[`sysUtils.strToFloat`](https://www.freepascal.org/docs-html/rtl/sysutils/strtofloat.html)
102+
103+`string`
104+
105+[[Char|char]]
106+
107+явный
108+
109+`stringVariable[indexExpression]`
110+
111+`char`/`ANSIChar`/`wideChar`
112+
113+`string`
114+
115+неявный
116+
117+оператор присваивания
118+
119+`char`/`ANSIChar`
120+
121+`byte`
122+
123+явный
124+
125+- [[Ord|ord]]
126+- `byte(characterVariableOrExpression)`
127+
128+`byte`
129+
130+`char`/`ANSIChar`
131+
132+явный
133+
134+- [[Chr|chr]]
135+- `ANSIChar(byteVariableOrExpression)`
136+
137+перечислимый тип
138+
139+`string`
140+
141+явный
142+
143+[`system.writeStr`](https://www.freepascal.org/docs-html/rtl/system/writestr.html)`(stringVariable, enumeratedVariableOrExpression)`
144+
145+В других случаях вы должны вручную выполнить явное приведение типов:
146+
147+| исходный тип данных | конечный тип данных | вариант преобразования типов | метод |
148+|----|----|----|----|
149+| [[QWord|qWord]] | `byte` | явный | `byte(qWordVariableOrExpression)` |
150+| `qWord` | `word` | явный | `word(qWordVariableOrExpression)` |
151+| `qWord` | [[Cardinal|cardinal]] | явный | `cardinal(qWordVariableOrExpression)` |
152+| `qWord` | `longWord` | явный | `longWord(qWordVariableOrExpression)` |
153+| `longWord` | `byte` | явный | `byte(longWordVariableOrExpression)` |
154+| `longWord` | `word` | явный | `word(longWordVariableOrExpression)` |
155+| `longWord` | `cardinal` | неявный | оператор присваивания |
156+| `int64` | `byte` | явный | `byte(int64variableOrExpression)` |
157+| `int64` | `shortInt` | явный | `shortInt(int64variableOrExpression)` |
158+| [[Comp|comp]] | `byte` | явный | `byte(compVariableOrExpression)` |
159+| `comp` | `shortInt` | явный | `shortInt(compVariableOrExpression)` |
160+| `comp` | `real` | явный | `real(compVariableOrExpression)` |
161+
162+приведение типов
163+
164+## Предостережение
165+
166+- Явное приведение типов отключает проверку диапазона в полной [[LOC|строке кода]].
167+
168+## См.также
169+
170+- [«Кастинг типов (компьютерное программирование)»](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B8%D0%BF%D0%B0) в русской Википедии
171+- [§ “value typecasts”](https://www.freepascal.org/docs-html/ref/refse80.html) в справочном руководстве FreePascal
172+- [§ “variable typecasts”](https://www.freepascal.org/docs-html/ref/refse81.html) в справочном руководстве FreePascal
173+- [§ “`unaligned` typecasts”](https://www.freepascal.org/docs-html/ref/refse82.html) в справочном руководстве FreePascal
174+- [[Operator overloading|Перегрузка операторов]] (особая группа операторов присваивания и § «маршрутизация»)
175+
176+---
177+*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](/wiki-contact).*

Back to history