【发布时间】: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);
}
虽然它成功了,但它仍然可能是未定义的行为......
【问题讨论】: