为什么有符号整数上的绝对值方法不返回无符号值?

时间:2018-08-08 18:21:27

标签: rust

以下代码无法编译:

fn main() {
    let x = (-5i32).abs();

    let z: u32 = x;
}

显示以下消息:

error[E0308]: mismatched types
 --> src/main.rs:4:18
  |
4 |     let z: u32 = x;
  |                  ^ expected u32, found i32

阅读the documentation时,看来i32的选择源于i32::min_value()i32中没有正面表示的事实。但是,它在u32中将具有正表示,可以表示两倍大的数字。

我正在学习语言,并且想了解为什么要做出某些设计决定,以便养成良好的习惯。我发现这令人困惑。有人可以解释为什么这样做而不是仅仅返回u32,它在语义上是正确的吗?

1 个答案:

答案 0 :(得分:10)

有一个指向the development meeting minutes的链接,在proposed RFC "Change abs() to return unsigned integers"

中对此进行了讨论。

主要原因似乎是:

  1. 许多其他语言使用i32-> i32(例如C,Java),因为其他值意外提升为u32可能会导致错误。 Rust最初出于这个原因(即遵循惯例)似乎使用了i32-> i32,但是并没有遇到相同类型的错误。
  2. 直到Rust达到测试版之后才提交此功能请求。开发人员不愿意对似乎罕见的错误进行重大更改。这似乎是保持这种状态的主要原因。

似乎可以接受的解决方法是使用as u32进行投射。

i32::overflowing_abs i32::wrapping_absi32::checked_abs实现了i32::min_value()错误的其他解决方案,但没有一个产生u32。