我一直在逐步阅读 Programming Rust 书,并想观察两者的补码包装,如此简单的代码:
fn main() {
let mut x: u8 = 255;
println!("the value of x is {}", x) ;
x = 255 + 1 ;
println!("The value of x now is {}",x) ;
}
当我尝试按照指南使用 Cargo 编译它时,我运行cargo 构建--发布
书中说会让它在没有溢出保护的情况下编译,但它不会编译。我收到保护错误
|
6 | x = 255 + 1 ;
| ^^^^^^^^^^^ 尝试计算
u8::MAX + 1_u8
, 会溢出你能解释一下我做错了什么吗?
最佳答案
我相信在运行时不会动态检查该值(它不会 panic
并且会溢出),但在编译期间仍会静态检查(如果可能的话)。
在这种情况下,编译器能够在编译时确定您要执行的操作并阻止您执行此操作。
话虽如此,如果您查看编译器输出,您会看到以下消息:
note:
#[deny(arithmetic_overflow)]
on by default
无论优化级别如何,您都会看到此消息。
如果您想观察溢出,请输入以下
inner attribute
在源文件的顶部。#![allow(arithmetic_overflow)]
或者,如果您使用 rustc
进行编译您可以直接传递以下标志:-O -A arithmetic_overflow
rustc
文档显示默认情况下以下 lints 处于打开状态(无论优化级别如何)关于rust - 测试溢出时忽略 Cargo build --release 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66484430/