为什么`i32 as usize`在溢出时不会恐慌?

问题描述 投票:0回答:1

如果我尝试从 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 中如此轻松地获得此溢出。

rust
1个回答
0
投票
整数类型之间的

as
不做任何检查,它只是将相同的字节重新解释为不同的类型,如果需要则截断或零/符号扩展(意味着当值太大或太小时时溢出)。 请参阅参考资料了解确切的详细信息

这(

as
不安全)是建议反对
as
的原因之一,并慢慢被其他更安全的东西取代(另一个原因是
as
做了太多不同的事情)。

as
作为整数转换的替代方法是使用
From
/
Into
TryFrom
/
TryInto
。当无损转换(有符号或无符号整数到更大的整数类型)时,
From
Into
在整数之间实现。当可能存在精度损失(转换为较小类型或具有不同无符号的相同大小)或大小未知时(除
TryFrom
TryInto
u8
之外的任何整数),使用
u16
/
usize
同样,除了
i8
i16
isize
之外的任何整数)。如果该值不适合,他们将返回错误。

因此,请用

isize::try_from(a).unwrap()
替换您的转换(或优雅地处理错误)。

© www.soinside.com 2019 - 2024. All rights reserved.