Rust 查找介于0和无符号整数与有符号整数之和之间的最大值

Rust 查找介于0和无符号整数与有符号整数之和之间的最大值,rust,type-conversion,max,Rust,Type Conversion,Max,我正试图写一个函数,它将有一个X位置和一个偏移量。这个偏移量可以是负数也可以是正数,所以我需要对它进行签名。因此,如果我将其传递给X=0和ofs=-3我需要函数将X设置为0,或者如果我将其传递给X=0,ofs=6和uppr\u lmt=5我需要将其设置为5 fn测试(x:&mut u32,ofs:i32,uppr\U lmt:u32){ 使用std::cmp::max; 如果ofsu32{ 使用std::cmp::{max,min}; 让y; 如果ofsu32{ 使用std::cmp::{max

我正试图写一个函数,它将有一个X位置和一个偏移量。这个偏移量可以是负数也可以是正数,所以我需要对它进行签名。因此,如果我将其传递给
X=0
ofs=-3
我需要函数将
X
设置为
0
,或者如果我将其传递给
X=0
ofs=6
uppr\u lmt=5
我需要将其设置为
5

fn测试(x:&mut u32,ofs:i32,uppr\U lmt:u32){
使用std::cmp::max;
如果ofs<0{
x=最大值(0,x+ofs);
}否则{
x=最大值(uppr_lmt,x+ofs);
}
}

然而,在该代码中,rust抱怨将
i32
添加到
&mut u32
0
以及
uppr\u lmt
不属于
&mut u32
类型。我怎样才能着手解决这个问题?我还不太熟悉Rust,也不习惯类型转换。

下面的代码返回的是u32,而不是改变x值。请注意,我们正在进行到i64的额外转换,因为在i32中,由于负数的存储方式,-3将被视为大于0(负数的MSB为1,而u32的MSB为2次方)。请注意,我在这里对else案例使用了min,因为否则,对于传递给函数的0,5,6,它返回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
 }
fn测试(x:u32,ofs:i32,uppr\u lmt:u32)->u32{
使用std::cmp::{max,min};
让y;
如果ofs<0{
y=最大值(0,x为i64+ofs为i64);
}否则{
y=最小值(uppr_lmt为i64,x为i64+ofs为i64);
}
y为u32
}
如果输入在i32范围内,而不是u32范围内(如果数字加上偏移量小于2^31-1),也可以像这样使用i32而不是i64

fn测试(x:u32,ofs:i32,uppr\u lmt:u32)->u32{
使用std::cmp::{max,min};
让y;
如果ofs<0{
y=最大值(0,x为i32+ofs);
}否则{
y=最小值(uppr_lmt为i32,x为i32+ofs);
}
y为u32
}

想想看:如果求和的结果为负数,u32将无法保存它。如果大于2^31-1,i32将无法容纳它。我不知道生锈的原因,但C你会使用比这两种都宽的字体,而且必须在课程上签字。
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
}