提问人:Kodra 提问时间:10/12/2023 最后编辑:John KugelmanKodra 更新时间:10/12/2023 访问量:156
为什么 u32 不能加减 i32?[已结束]
Why can't u32 add or subtract i32? [closed]
问:
let a: u32 = 10;
let b: i32 = 100;
let c = a - b;
即使是这个简单的操作也不起作用。 只是无法操作.但我真的很想知道这背后的设计原则是什么。我不认为比.例如:u32
i32
u32 - i32
u32 - u32
let a: u32 = 10;
let b: u32 = 100;
let c = a - b;
可以编译,但它在运行时会死机。那么,为什么 Rust 对不同数值类型之间的操作如此偏执呢?处理这个问题的惯用方法是什么,随处可见?as
我发现即使是选中的操作也不适用于不同的数值类型,这有点疯狂。
let a: u32 = 10;
let b: i32 = 100;
let c = a.checked_sub(b);
答:
7赞
Colonel Thirty Two
10/12/2023
#1
这并不是有符号与无符号所独有的;Rust 甚至不允许你将不同大小的整数加在一起:
fn main() {
println!("{}", 5u32 + 10u16);
}
error[E0308]: mismatched types
--> src/main.rs:3:26
|
3 | println!("{}", 5u32 + 10u16);
| ^^^^^ expected `u32`, found `u16`
error[E0277]: cannot add `u16` to `u32`
对于将有符号值添加到无符号值的特定情况,有 checked_add_signed
、overflowing_add_signed
、saturating_add_signed
和 wrapping_add_signed
等函数。
好吧,人们可能不同意这一点,但u32.checked_sub(i32)肯定应该是 u32?我真的不认为它如此模棱两可。
你在自己的评论中承认,你认为不是每个人都会同意一个明显的行为,这确实是问题的关键。C 和 C++ 在整数提升方面有一些笨拙的规则 - 像表达式中的杂散非限定文字会将表达式转换为有符号整数。Rust 决定让一切变得明确。123
评论
0赞
cafce25
10/12/2023
与其说是 Rust “甚至不会让你添加不同大小的整数”,不如说是 core 没有实现相关特征。它可以很好地实现具有不同 rhs 运算符的 add
评论
u32 - i32
u32
i32
as
From
TryFrom
checked_add
checked_sub
xxx_add
u32.checked_add(i32)
u32 - u32
checked
Result
u32
i32