|
150 | 150 | int main() |
151 | 151 | { |
152 | 152 | uint32_t a = 256; |
153 | | - uint8_t b = a; |
| 153 | + uint8_t b = static_cast<uint8_t>(a); |
154 | 154 | uint32_t c = b; |
155 | 155 | std::cout << c; |
156 | 156 | } |
157 | 157 | ``` |
158 | 158 |
|
159 | 159 | <details> |
160 | | - <summary>Правильный ответ:</summary> |
| 160 | + <summary> |
161 | 161 |
|
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 | + по умолчанию он произойдет автоматически. |
165 | 171 | При этом компилятор не дает ошибок, |
166 | | - если не переданы флаги предупреждения при компиляцию. |
| 172 | + если не переданы флаги предупреждения при компиляции. |
167 | 173 |
|
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 | + оставляя только последний байт (наименьший байт). |
173 | 186 |
|
174 | 187 | Ответ будет 0, потому что число 256 имеет запись `1 0000 0000` в двоичной системе, |
175 | 188 | а обрезание этого числа до 8 бит оставит лишь `0000 0000`, |
176 | 189 | удалив старшую 1. |
| 190 | +
|
177 | 191 | </details> |
178 | 192 |
|
179 | 193 | 5. (продвинутый уровень) |
|
0 commit comments