是否预计在Rust中过大的位移是未定义的行为?

Fre*_*ios 5 bit-shift undefined-behavior rust

当您运行此代码时:

#![allow(exceeding_bitshifts)]

fn main() {
    const NUMBER: u64 = 0b_10101010;

    fn print_shift(i: u32) {
        println!("{:b}", NUMBER >> i);
    }

    print_shift(65);
    println!("{:b}", NUMBER >> 65);
}
Run Code Online (Sandbox Code Playgroud)

您会看到,在编译时或运行时执行时,使用超出位长度的值移位数字位会产生不同的行为.

这是正常的行为吗?它在某处记录了吗?这不在记录的未定义行为列表中.

She*_*ter 5

不,这不是预期的,但它不是未定义的行为.这只是一个"错误".

这里应该是之间的常量是如何在编译时和如何计算价值在运行时计算没有什么区别.这通常是一个难题,因为执行编译的机器和运行代码的机器可能具有完全不同的体系结构.


在谈论调试与发布版本时,预期"过大"位移的行为,也不是未定义的行为.线索在错误消息中:

试图向上移动溢出

整数溢出既不安全也不定义:

Rust编译器不认为以下行为是不安全的,尽管程序员可能(应该)发现它们是不合需要的,意外的或错误的.

  • ...
  • 整数溢出

也可以看看:

  • @Boiethios 我不确定您是否正确使用了*未定义的行为* 一词。`random()`(通常)在不同的调用中返回不同的答案,但这并不意味着它的行为是未定义的。 (2认同)