在Rust中包含负数

时间:2018-01-07 18:39:35

标签: rust

我正在重写Rust中的C代码,它严重依赖于u32变量并将它们包裹起来。例如,我有一个像这样定义的循环:

#define NWORDS 24
#define ZERO_WORDS 11

int main()
{
    unsigned int i, j;

    for (i = 0; i < NWORDS; i++) {
        for (j = 0; j < i; j++) {
            if (j < (i-ZERO_WORDS+1)) {
            }
        }
    }

    return 0;
}

现在,if语句需要将u32包含在最初i = 0的几个值中。我遇到了wrapping_neg method,但它似乎只是计算-self。是否还有更灵活的方法可以在Rust中使用u32并允许包装?

1 个答案:

答案 0 :(得分:6)

作为mentioned in the comments,您问题的字面答案是使用u32::wrapping_subu32::wrapping_add

const NWORDS: u32 = 24;
const ZERO_WORDS: u32 = 11;

fn main() {
    for i in 0..NWORDS {
        for j in 0..i {
            if j < i.wrapping_sub(ZERO_WORDS).wrapping_add(1) {}
        }
    }
}

但是,除非您正在执行散列/加密/压缩/类似操作,否则我主张避免依赖包装操作。包装操作不直观。例如,j < i-ZERO_WORDS+1j+ZERO_WORDS < i+1的结果不同。

更好的是重写逻辑。我甚至不能告诉 if表达式在哪些情况下都是真的,而不花费大量时间思考它!

事实证明 的条件将被评估为i=9, j=8,而不是i=10, j=0。也许所有这一切在真实的代码中都比较清晰,但是没有背景它会让人很困惑。

这似乎有相同的逻辑,但对我来说似乎更容易理解:

i < ZERO_WORDS - 1 || i - j > ZERO_WORDS - 1;

比较

j < i.wrapping_sub(ZERO_WORDS).wrapping_add(1);