Rust 为什么不';有符号整数上的绝对值方法是否返回无符号值?
以下代码无法编译:Rust 为什么不';有符号整数上的绝对值方法是否返回无符号值?,rust,Rust,以下代码无法编译: fn main() { let x = (-5i32).abs(); let z: u32 = x; } 我谨此致辞: 错误[E0308]:类型不匹配 -->src/main.rs:4:18 | 4 |设z:u32=x; |^应为u32,找到i32 从阅读上看,i32的选择源于这样一个事实,即i32::min_value()在i32中没有正表示。但是,它在u32中有一个正表示,它可以表示两倍大的数字 我正在学习这门语言,我想了解为什么要做出某些设计决策,
fn main() {
let x = (-5i32).abs();
let z: u32 = x;
}
我谨此致辞:
错误[E0308]:类型不匹配
-->src/main.rs:4:18
|
4 |设z:u32=x;
|^应为u32,找到i32
从阅读上看,i32
的选择源于这样一个事实,即i32::min_value()
在i32
中没有正表示。但是,它在u32
中有一个正表示,它可以表示两倍大的数字
我正在学习这门语言,我想了解为什么要做出某些设计决策,这样我才能养成良好的习惯。我觉得这一点令人困惑。有人能解释一下为什么它是这样工作的,而不是仅仅返回一个语义正确的类型u32
看来主要原因是:
i32
->i32
(例如,C、Java),因为意外地将其他值提升到u32
可能会导致错误。Rust最初似乎出于这个原因使用了i32
->i32
(即遵循惯例),但没有遭受相同类型的错误as u32
进行强制转换
i32::overflow_abs
i32::wrapping_abs
和i32::checked_abs
为i32::min_value()
缺陷实施其他解决方案,但它们都不会产生u32。考虑一下这个片段(我假设它可能是有效的):让x=-5i32;x=x.abs()代码>返回u32需要一个cast将其分配回同一个变量,这也是我想象它通常以它的方式实现的原因之一is@Thymine没错。pull请求Shepmaster links有一个讨论,认为这实际上是一个比尝试将结果作为无符号数字处理要难得多的用例。它也有开发记录,所以我正在写一个基于这些的答案。关于锈迹考古学的好消息!