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

问题描述:

在C中产生未定义行为的整数的一些操作在Rust中定义。一个共同的主题是,他们在调试模式下恐慌,并在发布模式下定义了非恐慌结果。例如,在调试模式下,有符号整数溢出恐慌,但在发布模式下进行封装。还有运营商变体定义类似于wrapping_add(),saturating_add()等。在Rust中左移一个负值未定义的行为?

但是,如何转换负值?这是C.不确定的行为

下面的测试情况锈1.17.0成功:

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

虽然它成功它仍然是不确定的行为...

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