簡體   English   中英

如何在 Rust 中返回 integer 溢出標志?

[英]How do I return a flag on integer overflow in Rust?

Swift 有 integer 個溢出算術函數,返回一個標志是否溢出。 我們在 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 之前,標准庫以CheckedAddCheckedSubCheckedMulCheckedDiv的形式提供了檢測 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)
  • 包裝操作返回的值等於數學上正確的結果模值的范圍:

     fn main() { { let s=500_u16.wrapping_mul(500); println!("{}", s); } }

在這種情況下

   s=53392 // (500*500) module 2^16 =53392
  • 溢出操作返回一個元組(result, overflowed) ,result 是函數的包裝版本將如上返回, overflowed是一個布爾值,指示是否發生溢出。 您可以將此布爾值用作標志:

     fn main() { { // because u8 0 to 2^8 –1 (0 to 255) let s=255_u8.overflowing_add(2); // {:?} is used to print a value that implements Debug trait println!("{:?}", s); // s= (1, true) } }

你可以在這里測試代碼: https ://play.rust-lang.org/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM