You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust如何不使用unsafe将u32常量转换为i32常量

方案1:Rust 1.63及以上版本直接用安全常量转换

从Rust 1.63版本开始,整数的TryFrom转换已经支持常量上下文,你注释中尝试的写法现在可以直接编译,全程安全无unsafe:

const ERROR_NO_MORE_FILES_I32: i32 = i32::try_from(ERROR_NO_MORE_FILES).unwrap();

编译期会自动校验数值范围,如果u32常量超出i32的合法范围会直接报错,没有运行时风险。

方案2:兼容旧版本Rust的无unsafe写法

如果你需要兼容更低版本的Rust,完全可以直接用as转换,不需要加unsafe块:

const ERROR_NO_MORE_FILES_I32: i32 = ERROR_NO_MORE_FILES as i32;

这里不需要unsafe的原因很简单:Windows系统错误码的取值范围固定为0~0x7FFFFFFF,天然落在i32的非负合法范围内,这种场景下u32转i32的as转换行为是明确定义的,不会产生任何未定义行为,你原来代码里的unsafe属于多余添加。

方案3:无需额外定义常量的简化写法

你甚至可以不用单独声明i32版本的常量,直接在match分支做转换即可,全版本兼容且安全:

use std::io::Error;

const ERROR_NO_MORE_FILES: u32 = 18;

fn main() -> Result<(), Error> {
    let err = Error::last_os_error();
    match err.raw_os_error() {
        Some(code) if code == ERROR_NO_MORE_FILES as i32 => println!("No more files..."),
        Some(_) => return Err(err),
        _ => {}
    }
    Ok(())
}

内容的提问来源于stack exchange,提问作者blep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 22:15:04