【问题标题】:Is left-shifting a negative value undefined behavior in Rust?左移是 Rust 中的负值未定义行为吗?
【发布时间】:2017-05-06 15:39:23
【问题描述】:

在 C 中产生未定义行为的整数操作在 Rust 中定义。一个共同的主题是他们在调试模式下恐慌,在发布模式下有一个定义的非恐慌结果。例如,有符号整数溢出在调试模式下会发生恐慌,但在发布模式下会换行。还定义了运算符变体,例如wrapping_add()saturating_add() 等。

但是转移一个负值呢?这是 C 中未定义的行为。

以下测试用例在 Rust 1.17.0 中成功:

#[test]
fn negative_shift() {
    let i = -128i8;
    let j = i << 1;
    assert_eq!(j, 0);
}

虽然它成功了,但它仍然可能是未定义的行为......

【问题讨论】:

    标签: rust undefined-behavior


    【解决方案1】:

    Rust Reference 有一个list of all undefined behavior。左移一个超出类型大小的有符号数不在列表中。

    【讨论】:

      猜你喜欢
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 2020-06-15
      • 2011-05-19
      • 1970-01-01
      相关资源
      最近更新 更多