Swift有整数溢出算术函数,无论数字是否溢出,都会返回一个标志。我们在Rust中也有同样的东西吗?
自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));
(操场)
正如您所注意到的,有一些内部函数,但它们是unsafe
,使用起来有点烦人。
在Rust 1.0之前,标准库提供了检测CheckedAdd
、CheckedSub
、CheckedMul
和CheckedDiv
形式的4个算术运算溢出的包装器。
从Rust 1.0开始,这些特性不再存在,每个数字类型上都只有固有的方法,例如i32::checked_add
。
然而,这些只是检测溢出,而不会返回溢出的结果:
fn main() {
println!("{:?}", 5u16.checked_add(65530u16));
println!("{:?}", 6u16.checked_add(65530u16));
}
(操场)
打印:
Some(65535)
None
Rust具有整数算术内部函数,如add_with_overflow
。
pub unsafe extern "rust-intrinsic" fn add_with_overflow<T>(
x: T,
y: T
) -> (T, bool)