How do I return a flag on integer overflow in Rust

2019-02-22 04:03发布

问题:

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)