在Rust中,类型转换使用关键字as进行。它执行一种类型到另一种类型的显式转换:
let x: i32 = 10; let y: u8 = x as u8;
Rust不执行隐式转换(implicit cast),与C或C++不同。这防止了许多与数据丢失或溢出有关的错误。
特点:
潜在的危险:
i32转换为u8时,如果值超出了范围,多余的高位将被丢弃——这可能导致意外行为。示例:
let big: u16 = 300; let small: u8 = big as u8; // small == 44,因为300 % 256 = 44
如果通过关键字
as将负数类型i8转换为类型u8,会发生什么?
回答: 值不会导致编译错误或运行时的恐慌。相反,值的位将被解释为无符号数:
let x: i8 = -1; let y: u8 = x as u8; // y == 255
故事
在一个金融应用中,转账金额数据最初存储为i32。开发人员决定在不检查边界的情况下将其转换为u32,这导致负值处理不正确——金额意外变成了很大的正数,顺利通过了业务逻辑验证!
故事
在一个微控制器游戏中,加速级别的切换被计算为两个级别值的差:结果可能为负数。使用as u8进行结果四舍五入,忽视了溢出。结果“速度”停留在最大级别,因为负值由于环绕行为被转换为很大的正数。
故事
在一个网络应用中,复制数据缓冲区时,长度被计算为指针的差(usize),然后通过as转换为u32。在大内存量(>4GB)时,这导致值被截断,从而导致数据丢失和传输大文件时出错。