< 返回版块

joshsulin 发表于 2020-12-14 20:16

在看vector扩容源码时, 有这样一段代码

fn needs_to_grow(&self, len: usize, additional: usize) -> bool { additional > self.capacity().wrapping_sub(len) }

这段代码中 wrapping_sub 这个方法是什么意思? 查了一下文档.

https://doc.rust-lang.org/stable/std/primitive.isize.html#method.wrapping_sub

没有理解到.

接着又写了两句程序来运行.

fn main() { let a:i32 = 3; let b:i32 = 4; println!("{}", a.wrapping_sub(b)); }

想了一下,不就是一个减法吗?想不明白为什么要这样做?

求助大神们, wrapping_sub 这个方法的真实作用是什么?

评论区

写评论
作者 joshsulin 2020-12-15 19:43

非常感谢.

还是没有明白,判断是否扩容要这样来处理.

fn needs_to_grow(&self, len: usize, additional: usize) -> bool { additional > self.capacity().wrapping_sub(len) }

--
👇
whfuyn:

assert_eq!((-2isize).wrapping_sub(isize::MAX), isize::MAX);

看文档里的这个例子,负二减这个类型的最大值等于这个类型的最大值,这我记得是因为补码的负数范围比正数多一,减二恰好等于正数最大值。

其实wrapping就是一个值范围在[a, b]的类型,如果超了b,就又从a开始算,少于a就从b往回算。

取个模的意思。

whfuyn 2020-12-14 20:33
assert_eq!((-2isize).wrapping_sub(isize::MAX), isize::MAX);

看文档里的这个例子,负二减这个类型的最大值等于这个类型的最大值,这我记得是因为补码的负数范围比正数多一,减二恰好等于正数最大值。

其实wrapping就是一个值范围在[a, b]的类型,如果超了b,就又从a开始算,少于a就从b往回算。

取个模的意思。

1 共 2 条评论, 1 页