在Rust中,一些在C语言中会产生未定义行为的整数操作被定义了。一个常见的主题是,在调试模式下它们会触发panic,而在发布模式下则具有定义的非panic结果。例如,有符号整数溢出在调试模式下会引发panic,但在发布模式下会进行截断处理。还定义了像wrapping_add()、saturating_add()等操作符变体。
但是负值的移位操作呢?在C语言中这是未定义行为。
以下测试用例在Rust 1.17.0中成功运行:
虽然操作成功,但仍可能产生未定义行为...
但是负值的移位操作呢?在C语言中这是未定义行为。
以下测试用例在Rust 1.17.0中成功运行:
#[test]
fn negative_shift() {
let i = -128i8;
let j = i << 1;
assert_eq!(j, 0);
}
虽然操作成功,但仍可能产生未定义行为...