Swift has integer overflow arithmetic functions which return a flag whether the number has overflowed or not. Do we have same thing in Rust?
问题:
回答1:
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));
}
(playground)
Prints:
Some(65535)
None
回答2:
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));
(playground)
回答3:
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)