• 类型转换

    类型转换

    Rust 在基本类型之间没有提供隐式类型转换(强制类型转换)(implicit type conversion,coercion
    )。不过使用 as 关键字进行显式类型转换(explict type conversion,casting)。

    一般来说,Rust 的整型类型的转换规则遵循 C 语言的惯例,除了那些在 C 语言是未定义行为的情况。在
    Rust 中,所有的整型类型转换的行为都得到了很好的定义。

    1. // 消除会溢出的类型转换的所有警告。
    2. #![allow(overflowing_literals)]
    3. fn main() {
    4. let decimal = 65.4321_f32;
    5. // 报错!不能隐式转换类型
    6. let integer: u8 = decimal;
    7. // 改正 ^ 注释掉此行
    8. // 显式转换类型
    9. let integer = decimal as u8;
    10. let character = integer as char;
    11. println!("Casting: {} -> {} -> {}", decimal, integer, character);
    12. // 当将任意整数值转成无符号类型(unsigned 类型) T 时,
    13. // 将会加上或减去 std::T::MAX + 1,直到值符合新的类型
    14. // 1000 原本就符合 u16 类型
    15. println!("1000 as a u16 is: {}", 1000 as u16);
    16. // 1000 - 256 - 256 - 256 = 232
    17. // 在计算机底层会截取数字的低8位(the least significant bit,LSB),
    18. // 而高位(the most significant bit,MSB)数字会被抛掉。
    19. // (译注:此操作是按二进数存储的数字位进行)
    20. println!("1000 as a u8 is : {}", 1000 as u8);
    21. // -1 + 256 = 255
    22. println!(" -1 as a u8 is : {}", (-1i8) as u8);
    23. // 对正数来说,上面的类型转换操作和取模效果一样
    24. println!("1000 mod 256 is : {}", 1000 % 256);
    25. // 当将整数值转成有符号类型(signed 类型)时,同样要先将(二进制)数值
    26. // 转成相应的无符号类型(译注:如 i32 和 u32 对应,i16 和 u16对应),
    27. // 然后再求此值的补码(two's complement)。如果数值的最高位是 1,则数值
    28. // 是负数。
    29. // 除非值本来就已经符合所要转的类型。
    30. println!(" 128 as a i16 is: {}", 128 as i16);
    31. // 128 as u8 -> 128,再求数字128的8位二进制补码得到:
    32. println!(" 128 as a i8 is : {}", 128 as i8);
    33. // 重复上面的例子
    34. // 1000 as u8 -> 232
    35. println!("1000 as a i8 is : {}", 1000 as i8);
    36. // 232 的补码是 -24
    37. println!(" 232 as a i8 is : {}", 232 as i8);
    38. }