如何检查多个整数运算是否溢出?

问题描述 投票:0回答:1

如何在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
或在溢出时产生错误。

rust integer-overflow
1个回答
1
投票

由您决定是否需要检查,以及溢出时该怎么办。

如果溢出没有任何有意义的结果,可以返回

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
输入的有效结果。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.