Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么不';有符号整数上的绝对值方法是否返回无符号值?_Rust - Fatal编程技术网

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
    (即遵循惯例),但没有遭受相同类型的错误
  • 此功能请求在Rust达到测试版后才提交。开发人员不愿意对语言进行突破性的更改,因为这似乎是一个罕见的bug。这似乎是保持这种状态的主要原因 似乎公认的解决方法是使用
    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有一个讨论,认为这实际上是一个比尝试将结果作为无符号数字处理要难得多的用例。它也有开发记录,所以我正在写一个基于这些的答案。关于锈迹考古学的好消息!