Skip to content

Commit de28e46

Browse files
committed
static cast
1 parent 355014c commit de28e46

File tree

1 file changed

+25
-11
lines changed

1 file changed

+25
-11
lines changed

ru/labs/cpp/01_basics.md

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -150,30 +150,44 @@
150150
int main()
151151
{
152152
uint32_t a = 256;
153-
uint8_t b = a;
153+
uint8_t b = static_cast<uint8_t>(a);
154154
uint32_t c = b;
155155
std::cout << c;
156156
}
157157
```
158158
159159
<details>
160-
<summary>Правильный ответ:</summary>
160+
<summary>
161161
162-
По умолчанию, присваивание значения `uint32_t`
163-
к переменной типа `uint8_t` обрезает его (truncation),
164-
оставляя только последний байт (наименьший байт).
162+
Что делает `static_cast<uint8_t>`?
163+
164+
</summary>
165+
166+
В данном примере, он берет только младший байт числа от `a`,
167+
отсекая старшие 3 байта. Это называется truncation.
168+
169+
Если записать это без `static_cast<uint8_t>`,
170+
по умолчанию он произойдет автоматически.
165171
При этом компилятор не дает ошибок,
166-
если не переданы флаги предупреждения при компиляцию.
172+
если не переданы флаги предупреждения при компиляции.
167173
168-
>> Чтобы подобные ситуации определялись и останавливались компилятором,
169-
>> необходимо передать флаги предупреждений, компилируя например, вот так:
170-
>> ```
171-
>> g++ test.cpp -Wall -Werror -Wconversion
172-
>> ```
174+
> Чтобы подобные ситуации определялись и останавливались компилятором,
175+
> необходимо передать флаги предупреждений, компилируя например, вот так:
176+
> ```
177+
> g++ test.cpp -Wall -Werror -Wconversion
178+
> ```
179+
</details>
180+
181+
<details>
182+
<summary>Правильный ответ:</summary>
183+
184+
`static_cast<uint8_t>` обрезает значение `a` (truncation),
185+
оставляя только последний байт (наименьший байт).
173186
174187
Ответ будет 0, потому что число 256 имеет запись `1 0000 0000` в двоичной системе,
175188
а обрезание этого числа до 8 бит оставит лишь `0000 0000`,
176189
удалив старшую 1.
190+
177191
</details>
178192
179193
5. (продвинутый уровень)

0 commit comments

Comments
 (0)