如何在a的所有步骤中进行溢出检查:
fn somemath() -> u32 {
let x: u32 = y * 3 + 2;
return x
}
类似的东西
fn somemath() -> u32 {
let x: u32 = y.checked_mul(3).checked_add(2)
return x
}
或者在这种情况下避免溢出的最佳实践是什么?最后我需要
x
成为有效结果并返回 u32
或在溢出时产生错误。
由您决定是否需要检查,以及溢出时该怎么办。
如果溢出没有任何有意义的结果,可以返回
Option::None
,例如:
fn somemath(y: u32) -> Option<u32> {
let x: u32 = y.checked_mul(3)?.checked_add(2)?;
return Some(x);
}
fn somemath(y: u32) -> Option<u32> {
y.checked_mul(3)?.checked_add(2) // same, but shorter
}
您还可以检查输入是否足够小以至于永远不会发生溢出。或者,您可以使用更大的类型作为中间值(例如此处的
u64
)以获得任何 u32
输入的有效结果。