显式类型转换

    显式类型转换是强制类型转换的超集:所有的强制类型转换都可以通过显式转换的方式主动触发。但有一些场景只适用于显式转换。强制类型转换很普遍而且通常无害,但是显式类型转换是一种“真正的转换“,它的应用就很稀少了,而且有潜在的危险。因此,显式转换必须通过关键字主动地触发:expr as Type

    也就是说,显式类型转换不属于非安全(unsafe)行为,因为仅凭转换操作是不会违背内存安全性的。比如,将整型转换为裸指针很容易导致可怕的后果。但是,创建一个指针这个行为本身是安全的,而真正使用裸指针的操作则必须被标为unsafe

    • ,其中T, U: Sized
    • *T as *U,TODO:明确unsize的情况
    • *T as integer
    • integer as *T
    • number as number
    • 无成员枚举as integer
    • u8 as char
    • &[T; n] as *const T
    • fn as *T,其中T: Sized
    • fn as integer

    注意,裸slice转换后长度会改变,比如*const [u16] as *const [u8]创建的slice只包含原本一半的内存。

    对于数字类型的转换,如下几点需要注意:

    • 相同大小的整型互相转换(比如i32->u32)是一个no-op
    • 小尺寸的整型转换为大尺寸的整型(比如u8->u32)
      • 如果源类型是无符号的,将会补零
      • 如果源类型是有符号的,将会有符号补零
    • 浮点类型转换为整型会舍去浮点部分
    • 整型转换为浮点类型会产生这个整型的浮点型表示,
    • f64转换为f32会生成最近可能值(舍入到最近的可能取值,距离相同的取偶数)