如果我尝试从 usize 整数 rust 恐慌中减去负数。
fn main() {
let a: usize = 1;
println!("{}", a - 5);
}
error: this arithmetic operation will overflow
但是我可以将
i32
转换为 usize
并获得溢出,而不会出现任何警告或错误:
fn main() {
let a: i32 = -1;
let b: usize = a as usize;
println!("{}", b);
}
18446744073709551615
有更好的方法来铸造这个吗?我只是避免将
i32
转换为 usize
或手动检查溢出,但令我惊讶的是,我可以在 Rust 中如此轻松地获得此溢出。
as
不做任何检查,它只是将相同的字节重新解释为不同的类型,如果需要则截断或零/符号扩展(意味着当值太大或太小时时溢出)。 请参阅参考资料了解确切的详细信息。
这(
as
不安全)是建议反对as
的原因之一,并慢慢被其他更安全的东西取代(另一个原因是as
做了太多不同的事情)。
将
as
作为整数转换的替代方法是使用 From
/Into
和 TryFrom
/TryInto
。当无损转换(有符号或无符号整数到更大的整数类型)时,From
和Into
在整数之间实现。当可能存在精度损失(转换为较小类型或具有不同无符号的相同大小)或大小未知时(除 TryFrom
和 TryInto
到 u8
之外的任何整数),使用 u16
/usize
同样,除了 i8
和 i16
到 isize
之外的任何整数)。如果该值不适合,他们将返回错误。
因此,请用
isize::try_from(a).unwrap()
替换您的转换(或优雅地处理错误)。