Rust предоставляет неявное преобразование типов (принудительное) между примитивными типами.
Но, явное преобразование типов (casting) можно выполнить используя ключевое слово as.
Правила, используемые для преобразование внутренних типов, такие же, как в языка C, за исключением тех случаев, когда преобразование типов в языка C вызываем неопределенное поведение. В языке Rust описаны все поведения при преобразование внутренних типов.
// Убрать все предупреждения
// которые вызываются переполнением при преобразование типов.
#![allow(overflowing_literals)]
fn main() {
let decimal = 65.4321_f32;
// Ошибка ! Нет неявного преобразование
let integer: u8 = decimal;
// ИСПРАВЬТЕ ^ Закоментируйте данную строку
// Явное преобразование
let integer = decimal as u8;
let character = integer as char;
println!("Casting: {} -> {} -> {}", decimal, integer, character);
// Когда преобразовывается любое значение в беззнаковый тип T
// std::T::MAX + 1 добавляется или вычитается до тех пор, пока значение
// не будет помещаться в новый тип.
// 1000 поместится в u16
println!("1000 as a u16 is: {}", 1000 as u16);
// 1000 - 256 - 256 - 256 = 232
// Подробнее. Первые 8 младших битов (LSB) сохраняются,
// а старшие биты (MSB) будут усечены.
println!("1000 as a u8 is : {}", 1000 as u8);
// -1 + 256 = 255
println!(" -1 as a u8 is : {}", (-1i8) as u8);
// Для положительных чисел результатом будет остаток от деления
println!("1000 mod 256 is : {}", 1000 % 256);
// Когда значение преобразовывается в знаковый тип,
// побитовый результат будет таким же, как и
// первое преобразование к соответствующему типу без знака. Если старший бит этого значения
// равен 1, то это значение отрицательное.
// За исключением случая, когда значение умещается в тип.
println!(" 128 as a i16 is: {}", 128 as i16);
// 128 as u8 -> 128, дополнительный код которого в 8 битах:
println!(" 128 as a i8 is : {}", 128 as i8);
// повторяем примеры
// 1000 as u8 -> 232
println!("1000 as a i8 is : {}", 1000 as i8);
// и дополнительный код 232 - это -24
println!(" 232 as a i8 is : {}", 232 as i8);
}