将“bool”转换为“u8”

mal*_*rbo 7 rust

以下代码可在 amd64 上的 Rust 1.8 上正常运行。

use std::mem;

fn main() {
    let f: u8 = unsafe { mem::transmute(false) };
    let t: u8 = unsafe { mem::transmute(true) };
    assert_eq!(0, f);
    assert_eq!(1, t);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我可以假设这总是有效吗?我试图找到有关代表性的参考资料bool,但我只找到了thisthis,但我认为这并不权威。

Tim*_*ean 6

截至 2021 年更新Rust 参考现在将 的内存表示定义为bool等于 0 或 1 的 1 字节值:

布尔类型的对象的大小和对齐方式各为 1。值 false 具有位模式0x00,值 true 具有位模式0x01。对于具有任何其他位模式的布尔类型对象来说,这是未定义的行为。

  • @Stargateur Rust 没有规范规范。如果参考书的这一页不是为了定义 bool 的内存表示,我认为我们应该提交一个文档错误,因为这一页相当权威地陈述了一个表示。 (2认同)

Eli*_*man 1

从未采用任何 RFC 来定义bool. 也就是说,实际上它不太可能改变。