在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);
}
虽然它成功但它仍然可能是未定义的行为......