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

2024-03-25

以下代码无法编译:

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

Reading 文档 https://doc.rust-lang.org/std/primitive.i32.html#method.abs,看起来选择i32源于这样一个事实i32::min_value()没有积极的代表i32。然而,它would具有积极的代表性u32,它可以表示两倍大的数字。

我正在学习这门语言,并且想了解为什么做出某些设计决策,以便我可以养成良好的习惯。我觉得这很令人困惑。有人可以解释为什么它以这种方式工作而不是仅仅返回一个u32,这似乎是语义上正确的类型?


有一个链接开发会议纪要 https://github.com/rust-lang/meeting-minutes/blob/master/weekly-meetings/2015-04-07.md#change-abs-to-return-unsigned中对此进行了讨论提议的 RFC“更改 abs() 以返回无符号整数” https://github.com/rust-lang/rfcs/pull/1017

看起来主要原因是:

  1. 许多其他语言都使用i32 -> i32(例如,C、Java),因为意外将其他值提升为u32可能会导致错误。 Rust好像用过i32 -> i32最初出于这个原因(即遵循约定),但不会遭受相同类型的错误。
  2. 该功能请求直到 Rust 达到测试版后才提交。开发人员不愿意因为一个罕见的错误而对语言进行重大更改。这看起来是保持这种方式的主要原因。

似乎公认的解决方法是使用as u32来投射。

i32::overflowing_abs i32::wrapping_abs and i32::checked_abs实施其他解决方案i32::min_value()bug,但它们都不会产生 u32。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么有符号整数的绝对值方法不返回无符号值? 的相关文章

随机推荐