【问题标题】:How do I return a flag on integer overflow in Rust?如何在 Rust 中返回整数溢出标志?
【发布时间】:2014-10-23 22:41:27
【问题描述】:

Swift 有整数溢出算术函数,它返回一个标志,无论数字是否溢出。我们在 Rust 中也有同样的东西吗?

【问题讨论】:

    标签: rust integer-overflow


    【解决方案1】:

    从 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));
    

    (playground)

    【讨论】:

      【解决方案2】:

      正如您所注意到的,有 intrinsics 用于此,但这些是 unsafe 并且使用起来有些烦人。

      在 Rust 1.0 之前,标准库提供了包装器,用于检测 CheckedAddCheckedSubCheckedMulCheckedDiv 形式的 4 种算术运算的溢出。

      从 Rust 1.0 开始,这些特征不再存在,每个数字类型只有固有方法,例如 i32::checked_add

      然而,这些只是检测溢出并且不返回溢出结果:

      fn main() {
          println!("{:?}", 5u16.checked_add(65530u16));
          println!("{:?}", 6u16.checked_add(65530u16));
      }
      

      (playground)

      打印:

      Some(65535)
      None
      

      【讨论】:

        【解决方案3】:

        Rust 具有整数算术内在函数,例如 add_with_overflow

        pub unsafe extern "rust-intrinsic" fn add_with_overflow<T>(
            x: T, 
            y: T
        ) -> (T, bool)
        

        【讨论】:

        • 你知道为什么是unsafe吗?
        • @delnan,默认情况下,所有编译器内部函数都是 unsafe(它们是一个实现细节,只是通过带有自定义 ABI 的 FFI 导入,所有 FFI 函数都标记为 unsafe,有一些想法使这个可控/具有安全的内在函数不是-unsafe,但这是低优先级)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-20
        • 1970-01-01
        • 1970-01-01
        • 2021-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多