在Rust中左移一个负值未定义的行为?

时间:2017-05-06 15:39:24

标签: rust undefined-behavior

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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