rust - 通过列表向后循环时在 'attempt to subtract with overflow' 出现 panic

标签 rust integer-overflow integer-arithmetic

我正在为一个向前或向后移动索引的列表编写一个循环方法。以下代码用于向后循环:

(i-1)%list_length

在这种情况下,iusize 类型,这意味着它是无符号的。如果 i 等于 0,这将导致“尝试减去溢出”错误。我尝试使用正确的转换方法来解决这个问题:

((i as isize)-1)%(list_length as isize)) as usize

这会导致整数溢出。

我明白为什么会发生错误,目前我已经通过检查索引是否等于 0 来解决问题,但我想知道是否有某种方法可以通过将变量转换为正确的类型来解决它.

最佳答案

作为DK. points out ,您不希望在整数级别包装语义:

fn main() {
    let idx: usize = 0;
    let len = 10;

    let next_idx = idx.wrapping_sub(1) % len;
    println!("{}", next_idx) // Prints 5!!!
}

相反,您想使用模逻辑环绕:

let next_idx = (idx + len - 1) % len;

这仅在 len + idx 小于类型的最大值时才有效 — 使用 u8 更容易看到使用;只需将 idx 设置为 200 并将 len 设置为 250。

如果您不能保证两个值的总和始终小于最大值,我可能会使用“已检查”操作系列。这会执行您提到的相同级别的条件检查,但整齐地绑定(bind)在一行中:

let next_idx = idx.checked_sub(1).unwrap_or(len - 1);

关于rust - 通过列表向后循环时在 'attempt to subtract with overflow' 出现 panic ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41301485/

相关文章:

rust - 是否不可能对使用智能指针(如 Box、Rc 或 Arc)的递归数据类型进行嵌套匹配?

c - C语言中的除法

java - % 2147483647L 在纪元时间是什么意思?

c++ - 如何检测无符号整数溢出?

security - 整数溢出是如何被利用的?

r - 当计算非常大的数字时,模数的准确性完全丧失

performance - 计算百分比的浮点乘法的快速替代方法

compiler-errors - 尝试在 Rust v0.13.0 中打印整数时出现编译错误

floating-point - 是否可以在不添加小数点的情况下将 int 文字强制转换为 Rust 中的 float ?

amazon-s3 - 使用 rusoto 将字符串上传到 S3