为什么u32不能加或减i32?

问题描述 投票:0回答:1
    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 type-conversion numeric arithmetic-expressions
1个回答
0
投票

这并不是签名与未签名所独有的; 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 决定让一切变得明确。

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