找到 0 和 unsigned int 与 signed int 的总和之间的最大值
find the max between 0 and a sum of an unsigned int with a signed int
我正在尝试编写一个将采用 X 位置和偏移量的函数。这个偏移量可以是负数也可以是正数,所以我需要对它进行签名。因此,如果我传递它 X = 0
和 ofs = -3
,我还需要将 X
设置为 0
的函数,或者如果我传递它 X = 0
、ofs = 6
和 uppr_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 u32
和 0
以及 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
}
我正在尝试编写一个将采用 X 位置和偏移量的函数。这个偏移量可以是负数也可以是正数,所以我需要对它进行签名。因此,如果我传递它 X = 0
和 ofs = -3
,我还需要将 X
设置为 0
的函数,或者如果我传递它 X = 0
、ofs = 6
和 uppr_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 u32
和 0
以及 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
}