如何在 Rust 中将有符号整数添加到无符号整数,检查无符号溢出?

goo*_*121 1 unsigned signed rust

我想将 a 添加isize到 ausize并包括边界检查,以便结果不会溢出 a 的边界usize。如何才能做到这一点?

Val*_*tin 5

你可以使用的组合isize::is_negative()isize::wrapping_abs()usize::checked_add()usize::checked_sub()

const fn add(lhs: usize, rhs: isize) -> Option<usize> {
    if rhs.is_negative() {
        lhs.checked_sub(rhs.wrapping_abs() as usize)
    } else {
        lhs.checked_add(rhs as usize)
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么isize::is_negative()vs rhs < 0? 在这种情况下,它不会改变任何东西,因为对文字的逻辑运算算作常量表达式

然而,虽然它被允许用于文字,但通常是不允许的,因为特征方法不能是const. 因此,如果您有一个包装类型,例如,Foo(isize)则不允许foo < Foo(0)在 const 上下文中说。尽管如此,可以说foo.is_negative()asFoo仍然可以实现const fn is_negative().

是的,你仍然可以说foo.0 < 0,但这不是我想要表达的观点。