【发布时间】:2014-10-23 22:41:27
【问题描述】:
Swift 有整数溢出算术函数,它返回一个标志,无论数字是否溢出。我们在 Rust 中也有同样的东西吗?
【问题讨论】:
标签: rust integer-overflow
Swift 有整数溢出算术函数,它返回一个标志,无论数字是否溢出。我们在 Rust 中也有同样的东西吗?
【问题讨论】:
标签: rust integer-overflow
从 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));
【讨论】:
正如您所注意到的,有 intrinsics 用于此,但这些是 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)
【讨论】:
unsafe吗?
unsafe(它们是一个实现细节,只是通过带有自定义 ABI 的 FFI 导入,所有 FFI 函数都标记为 unsafe,有一些想法使这个可控/具有安全的内在函数不是-unsafe,但这是低优先级)。