我正在重写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
并允许包装?
答案 0 :(得分:6)
作为mentioned in the comments,您问题的字面答案是使用u32::wrapping_sub
和u32::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+1
与j+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);