左移是 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 中的负值未定义行为吗?的主要内容,如果未能解决你的问题,请参考以下文章

C 中的 sum+++i 是未定义的行为吗? [复制]

计算地址差异是未定义的行为吗?

访问静态超出范围的未定义行为吗?

如果 a 未初始化,a^a 或 a-a 是未定义的行为吗?

这是未定义的行为吗

删除 null void* 指针是未定义的行为吗?