5 Casting
Rust가 제공하는 기본 타입 간의 변환은 암시없는 타입 변환(coercion)이다. 하지만 명시적 타입 변환(casting)을 사용하려면 as
키워드를 사용한다.
변환의 규칙은 정수 계열 타입 간에는 C의 규약을 일반적 따르는게 일반적이고, C에 정의되지 않은 경우는 예외이다. 모든 정수 계열 타입 간의 변환이 Rust에 잘 정의되어 있다.
// 변환으로 인한 오버플로우에 관련 경고 모두 무시하기. #![allow(overflowing_literals)] fn main() { let decimal = 65.4321_f32; // 에러! 암시적 변환은 안됨! let integer: u8 = decimal; // FIXME ^ 주석처리 하세요. // 명시적 변환 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, 이는 2의 보수를 취한 8비트: println!(" 128 as a i8 is : {}", 128 as i8); // 앞의 예제의 반복. // 1000 as u8 -> 232 println!("1000 as a i8 is : {}", 1000 as i8); // 232 의 2의 보수를 취하면 -24. println!(" 232 as a i8 is : {}", 232 as i8); }