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

max*_*zig 5 undefined-behavior rust

对于在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);
}
Run Code Online (Sandbox Code Playgroud)

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

She*_*ter 2

Rust参考有一个所有未定义行为的列表。左移超出类型大小的有符号数不在列表中。