Swift has integer overflow arithmetic functions which return a flag whether the number has overflowed or not. Do we have same thing in Rust?
As you note, there are intrinsics for this but these are unsafe
and somewhat annoying to use.
Before Rust 1.0, the standard library provided wrappers that detect the overflow for the 4 arithmetic operations in the form of CheckedAdd
, CheckedSub
, CheckedMul
and CheckedDiv
.
As of Rust 1.0, these traits no longer exist and there are just inherent methods on each numeric type, such as i32::checked_add
.
However, these just detect overflow and do not return the overflowed-result:
fn main() {
println!("{:?}", 5u16.checked_add(65530u16));
println!("{:?}", 6u16.checked_add(65530u16));
}
Prints:
Some(65535)
None
Since Rust 1.7.0, there's overflowing_<operation>(rhs)
defined on integer types.
Example for overflowing_add
:
Calculates
self
+rhs
Returns a tuple of the addition along with a boolean indicating whether an arithmetic overflow would occur. If an overflow would have occurred then the wrapped value is returned.
Example:
use std::i64;
assert_eq!(5i64.overflowing_add(2), (7, false));
assert_eq!(i64::MAX.overflowing_add(1), (i64::MIN, true));
Rust has integer arithmetic intrinsics such as add_with_overflow
.
pub unsafe extern "rust-intrinsic" fn add_with_overflow<T>(
x: T,
y: T
) -> (T, bool)
来源:https://stackoverflow.com/questions/26538700/how-do-i-return-a-flag-on-integer-overflow-in-rust