左移是 Rust 中的负值未定义行为吗?
Posted
技术标签:
【中文标题】左移是 Rust 中的负值未定义行为吗?【英文标题】:Is left-shifting a negative value undefined behavior in Rust? 【发布时间】: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);
虽然它成功了,但它仍然可能是未定义的行为......
【问题讨论】:
【参考方案1】:Rust Reference 有一个list of all undefined behavior。左移一个超出类型大小的有符号数不在列表中。
【讨论】:
以上是关于左移是 Rust 中的负值未定义行为吗?的主要内容,如果未能解决你的问题,请参考以下文章