在Rust中,将负值左移是否属于未定义行为?

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

虽然操作成功,但仍可能产生未定义行为...
1个回答

2

Rust参考手册中列出了所有未定义行为的清单。将有符号数字左移超过类型大小不在此清单中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接