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

Eon*_*nil 8 integer-overflow rust

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

Dan*_*gen 14

从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));
Run Code Online (Sandbox Code Playgroud)

(游乐场)


huo*_*uon 8

正如你所注意到的,有一些内在的东西,但这些unsafe使用起来有点烦人.

锈1.0之前,标准库提供的检测的形式为4个算术运算溢出包装CheckedAdd,CheckedSub,CheckedMulCheckedDiv.

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

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

fn main() {
    println!("{:?}", 5u16.checked_add(65530u16));
    println!("{:?}", 6u16.checked_add(65530u16));
}
Run Code Online (Sandbox Code Playgroud)

(游乐场)

打印:

Some(65535)
None
Run Code Online (Sandbox Code Playgroud)


Eon*_*nil 5

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

pub unsafe extern "rust-intrinsic" fn add_with_overflow<T>(
    x: T, 
    y: T
) -> (T, bool)
Run Code Online (Sandbox Code Playgroud)

  • @delnan,默认情况下所有编译器内部函数都是“不安全”的(它们是一个实现细节,只是通过具有自定义 ABI 的 FFI 导入,并且所有 FFI 函数都被标记为“不安全”,有一些想法可以使其可控/具有安全内在函数不是“不安全”,但优先级较低)。 (2认同)