找到 0 和 unsigned int 与 signed int 的总和之间的最大值

find the max between 0 and a sum of an unsigned int with a signed int

我正在尝试编写一个将采用 X 位置和偏移量的函数。这个偏移量可以是负数也可以是正数,所以我需要对它进行签名。因此,如果我传递它 X = 0ofs = -3,我还需要将 X 设置为 0 的函数,或者如果我传递它 X = 0ofs = 6uppr_lmt = 5 我需要将其设置为 5

fn test(x: &mut u32, ofs: i32, uppr_lmt: u32) {
    use std::cmp::max;

    if ofs < 0 {
        x = max(0, x + ofs);
    } else {
        x = max(uppr_lmt, x + ofs);
    }
}

然而,在此代码中,rust 抱怨将 i32 添加到 &mut u320 以及 uppr_lmt 不是 &mut u32 类型。我该如何解决这个问题?我对 Rust 还是很陌生,我不习惯类型转换。

下面的代码返回一个 u32 而不是改变 x 值。请注意,我们对 i64 进行了额外的转换,因为在 i32 中,由于负数的存储方式,-3 将被视为大于 0(负数的 MSB 为 1,而 u32 的 MSB 被视为 2 的幂)。请注意,我在这里使用 min 来表示其他情况,因为否则,对于传递给函数的 0,5,6,它 returns 6 因为 5 和 6 的最大值是 6,这不是您对问题的期望

 fn test(x: u32, ofs: i32, uppr_lmt: u32) -> u32 {
        use std::cmp::{max,min};
        let y;
        if ofs < 0 {
            y = max(0, x as i64 + ofs as i64);
        } else {
            y = min(uppr_lmt as i64, x as i64 + ofs as i64);
        }
        y as u32
 }

你也可以像这样使用 i32 而不是 i64,假设输入在 i32 范围内而不是 u32 范围内(如果数字加上偏移量小于 2^31 - 1)

fn test(x: u32, ofs: i32, uppr_lmt: u32) -> u32 {
    use std::cmp::{max,min};
    let y;
    if ofs < 0 {
        y = max(0, x as i32+ ofs);
    } else {
        y = min(uppr_lmt as i32, x as i32+ ofs);
    }
    y as u32
}