Rust類型轉換

Rust類型轉換

Rust提供原始類型到隱式類型之間的轉換(強制)。但是,顯式類型轉換可以使用關鍵字as進行。

整數類型之間的轉換規則遵循C約定, 除了在C是未定義行爲的轉換。所有類型轉換整型的行爲在Rust都很好的定義。

fn main() {
let decimal = 65.4321_f32;

// Error! No implicit conversion
let integer: u8 = decimal;
// FIXME ^ Comment out this line

// Explicit conversion
let integer = decimal as u8;
let character = integer as char;

println!("Casting: {} -> {} -> {}", decimal, integer, character);

// when casting any value to an unsigned type, T, 
// std::T::MAX + 1 is added or subtracted until the value
// fits into the new type

// 1000 already fits in a u16
println!("1000 as a u16 is: {}", 1000 as u16);

// 1000 - 256 - 256 - 256 = 232
println!("1000 as a u8 is : {}", 1000 as u8);
// -1 + 256 = 255
println!("  -1 as a u8 is : {}", (-1i8) as u8);

// For positive numbers, this is the same as the modulus
println!("1000 mod 256 is : {}", 1000 % 256);

// When casting to a signed type, the result is the same as 
// first casting to the corresponding unsigned type then 
// taking the two's complement.

// Unless it already fits, of course.
println!(" 128 as a i16 is: {}", 128 as i16);
// 128 as u8 -> 128, whose two's complement in eight bits is:
println!(" 128 as a i8 is : {}", 128 as i8);

// repeating the example above
// 1000 as u8 -> 232
println!("1000 as a i8 is : {}", 1000 as i8);
// and the two's complement of 232 is -24
println!(" 232 as a i8 is : {}", 232 as i8);

}