这个问题及其答案描述了为什么 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)
我刚刚意识到这x.wrapping_abs() as u32符合我的要求:除首先std::i32::MIN映射为 i32以外的所有数字的绝对值,然后转换为 u32,并std::i32::MIN保持不变,但随后将其转换为 u32 恰好将其转换为绝对值。这也适用于其他位宽。
| 归档时间: |
|
| 查看次数: |
380 次 |
| 最近记录: |