如何将负 i32 数添加到 usize 变量?
how to add a negative i32 number to an usize variable?
如:
let mut a : usize = 0xFF;
a += -1; // -1 may be from other variable, so there can't be a -= 1;
println!("{}", a);
输出为:
error[E0277]: the trait bound `usize: std::ops::Neg` is not satisfied
无论如何?
您的尝试无效,因为在 Rust 中,您只能在严格相似的类型之间进行操作。 Rust 不执行 any 隐式数字转换,因为它会像你在下面看到的那样搬起石头砸自己的脚:你有一个特殊情况和几种溢出的方法。
一种方法是将 i32
的绝对值转换为 usize
并根据它是负数还是正数来添加或删除它。但是,你必须处理取其绝对值时溢出的最小值的特殊情况:
fn add(u: usize, i: i32) -> usize {
if i.is_negative() {
u - i.wrapping_abs() as u32 as usize
} else {
u + i as usize
}
}
fn main() {
let u = 7;
let i1 = -1;
let i2 = 1;
let min = -2_147_483_648;
assert_eq!(add(u, i1), 6);
assert_eq!(add(u, i2), 8);
assert_eq!(add(3_000_000_000, min), 852_516_352);
}
您还可以验证溢出:
fn add(u: usize, i: i32) -> Option<usize> {
if i.is_negative() {
u.checked_sub(i.wrapping_abs() as u32 as usize)
} else {
u.checked_add(i as usize)
}
}
fn main() {
let u = 7;
let i1 = -1;
let i2 = 1;
assert_eq!(add(u, i1), Some(6));
assert_eq!(add(u, i2), Some(8));
assert_eq!(add(0, -1), None);
}
如:
let mut a : usize = 0xFF;
a += -1; // -1 may be from other variable, so there can't be a -= 1;
println!("{}", a);
输出为:
error[E0277]: the trait bound `usize: std::ops::Neg` is not satisfied
无论如何?
您的尝试无效,因为在 Rust 中,您只能在严格相似的类型之间进行操作。 Rust 不执行 any 隐式数字转换,因为它会像你在下面看到的那样搬起石头砸自己的脚:你有一个特殊情况和几种溢出的方法。
一种方法是将 i32
的绝对值转换为 usize
并根据它是负数还是正数来添加或删除它。但是,你必须处理取其绝对值时溢出的最小值的特殊情况:
fn add(u: usize, i: i32) -> usize {
if i.is_negative() {
u - i.wrapping_abs() as u32 as usize
} else {
u + i as usize
}
}
fn main() {
let u = 7;
let i1 = -1;
let i2 = 1;
let min = -2_147_483_648;
assert_eq!(add(u, i1), 6);
assert_eq!(add(u, i2), 8);
assert_eq!(add(3_000_000_000, min), 852_516_352);
}
您还可以验证溢出:
fn add(u: usize, i: i32) -> Option<usize> {
if i.is_negative() {
u.checked_sub(i.wrapping_abs() as u32 as usize)
} else {
u.checked_add(i as usize)
}
}
fn main() {
let u = 7;
let i1 = -1;
let i2 = 1;
assert_eq!(add(u, i1), Some(6));
assert_eq!(add(u, i2), Some(8));
assert_eq!(add(0, -1), None);
}