如何在Rust中返回整数溢出的标志?

时间:2014-10-23 22:41:27

标签: rust integer-overflow

Swift具有整数溢出算术函数,无论数字是否溢出,都会返回一个标志。我们在Rust有同样的事情吗?

3 个答案:

答案 0 :(得分:12)

自Rust 1.7.0以来,在整数类型上定义了overflowing_<operation>(rhs)

overflowing_add的示例:

  

计算self + rhs

     

返回一个加法元组以及一个布尔值指示   是否会发生算术溢出。如果溢出会有   发生了包裹的值。

示例:

use std::i64;

assert_eq!(5i64.overflowing_add(2), (7, false));
assert_eq!(i64::MAX.overflowing_add(1), (i64::MIN, true));

playground

答案 1 :(得分:8)

正如您所注意到的,这里有intrinsics,但这些unsafe使用起来有些烦人。

在Rust 1.0之前,标准库提供了包装器,以CheckedAddCheckedSubCheckedMulCheckedDiv的形式检测4个算术运算的溢出。< / p>

从Rust 1.0开始,这些特征不再存在,每种数字类型都有固有的方法,例如i32::checked_add

然而,这些只是检测溢出并且不返回溢出结果:

fn main() {
    println!("{:?}", 5u16.checked_add(65530u16));
    println!("{:?}", 6u16.checked_add(65530u16));
}

playground

打印:

Some(65535)
None

答案 2 :(得分:4)

Rust具有整数算术内在函数,例如add_with_overflow

pub unsafe extern "rust-intrinsic" fn add_with_overflow<T>(
    x: T, 
    y: T
) -> (T, bool)