当您运行此代码时:
#![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);
}
您会发现,在编译时或运行时,对超出位长度的值进行移位会产生不同的行为。
这是正常行为吗?它记录在某处吗?这不在记录的未定义行为列表 https://doc.rust-lang.org/beta/reference/behavior-considered-undefined.html.
不,这是not预计,但它是不是未定义的行为. 这“只是”一个错误 https://github.com/rust-lang/rust/issues/45239.
There should在编译时计算常量的方式与在运行时计算值的方式没有区别。一般来说,这是一个难题,因为执行编译的机器和运行代码的机器可能具有完全不同的体系结构。
当谈论调试与发布版本时,“太大”位移的行为是预期的,也是不是未定义的行为。线索就在错误消息中:
尝试右移并溢出
整数溢出既不是不安全也不是未定义 https://doc.rust-lang.org/beta/reference/behavior-not-considered-unsafe.html#integer-overflow:
Rust 编译器不认为以下行为不安全,
尽管程序员可能(应该)发现它们是不受欢迎的、意外的或
错误。
也可以看看:
- 如何关闭整数溢出保护? https://stackoverflow.com/q/31215139/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)