В Rust приведение типов (type casting) осуществляется с помощью ключевого слова as. Оно выполняет явное преобразование одного типа в другой:
let x: i32 = 10; let y: u8 = x as u8;
Rust не выполняет неявных преобразований (implicit cast), как, например, C или C++. Это предотвращает множество ошибок, связанных с потерей данных или переполнениями.
Особенности:
Потенциальные опасности:
i32 в u8, если значение выходит за пределы диапазона, лишние старшие биты просто отбрасываются — это может привести к неожиданному поведению.Пример:
let big: u16 = 300; let small: u8 = big as u8; // small == 44, т.к. 300 % 256 = 44
Что произойдет, если выполнить приведение отрицательного числа типа
i8к типуu8с помощью ключевого словаas?
Ответ: Значение не вызывает ошибку компиляции или панику времени выполнения. Вместо этого, биты значения интерпретируются как беззнаковое число:
let x: i8 = -1; let y: u8 = x as u8; // y == 255
История
В финансовом приложении данные о сумме переводов сначала хранились как i32. Разработчик решил перевести их в u32 без проверки границ, что привело к некорректной обработке отрицательных значений — суммы неожиданно становились большими положительными числами, проходя валидацию бизнес-логики!
История
В игре для микроконтроллеров переключение уровней ускорения вычислялось как разность двух значений уровня: результат мог быть отрицательным. Использовали приведение as u8 для округления результата, игнорируя переполнения. В результате скорости «зависали» на максимальном уровне, потому что отрицательные значения превращались в большие положительные из-за wrap-around поведения.
История
В сетевом приложении при копировании буфера данных длина считалась как разность указателей (usize), после чего приводилась к u32 с помощью as. При больших объёмах памяти (>4 ГБ) это приводило к усечению значения, что вызывало обрезание данных и ошибки при передаче большого файла.