在看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 这个方法的真实作用是什么?
1
共 2 条评论, 1 页
评论区
写评论非常感谢.
还是没有明白,判断是否扩容要这样来处理.
fn needs_to_grow(&self, len: usize, additional: usize) -> bool { additional > self.capacity().wrapping_sub(len) }
--
👇
whfuyn:
看文档里的这个例子,负二减这个类型的最大值等于这个类型的最大值,这我记得是因为补码的负数范围比正数多一,减二恰好等于正数最大值。
其实wrapping就是一个值范围在[a, b]的类型,如果超了b,就又从a开始算,少于a就从b往回算。
取个模的意思。
看文档里的这个例子,负二减这个类型的最大值等于这个类型的最大值,这我记得是因为补码的负数范围比正数多一,减二恰好等于正数最大值。
其实wrapping就是一个值范围在[a, b]的类型,如果超了b,就又从a开始算,少于a就从b往回算。
取个模的意思。