有没有办法获得 i32 的 u32 绝对值,它对 std::i32::MIN 做正确的事情?

Eri*_* P. 0 rust

这个问题及其答案描述了为什么 i32 上的 abs() 返回 i32 而不是 u32。它说“似乎接受的解决方法是as u32用来投射”。但是,如果参数是std::i32::MIN. 标准库中有没有办法获得正确的值,或者我应该用这个值的特殊情况编写自己的实现 - 像这样:

fn my_abs(x: i32) -> u32 {
  if x == std::i32::MIN {
    (-(x as i64)) as u32
  } else {
    x.abs() as u32
  }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_* P. 6

我刚刚意识到这x.wrapping_abs() as u32符合我的要求:除首先std::i32::MIN映射为 i32以外的所有数字的绝对值,然后转换为 u32,并std::i32::MIN保持不变,但随后将其转换为 u32 恰好将其转换为绝对值。这也适用于其他位宽。