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);
这并不是签名与未签名所独有的; 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++ 在整数提升方面有一些尴尬的规则 - 表达式中像
123
这样的杂散不合格文字会将表达式转换为有符号整数。 Rust 决定让一切变得明确。