相关疑难解决方法(0)

为什么布尔1字节而不是1位大小?

在C++中,

  • 为什么布尔1字节而不是1位大小?
  • 为什么不存在类似4位或2位整数的类型?

在为CPU编写仿真器时,我错过了上述内容

c++ cpu-architecture

115
推荐指数
8
解决办法
5万
查看次数

在C中bool(布尔)占用了多少空间?它是1位,1字节还是别的什么?

在C中bool(布尔)占用了多少空间?它是1位,1字节还是别的什么?程序是32位还是64位是否重要?

c boolean

19
推荐指数
4
解决办法
6万
查看次数

通过FFI将C99`bool`返回Rust的正确类型是什么?

一位同事和我一直在讨论如何通过FFI bool<stdbool.h>(又名_Bool)返回Rust.

我们想要在Rust中使用我们的C99代码:

bool
myfunc(void) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

我们让Rust了解myfunc使用extern C块:

extern "C" {
    fn myfunc() -> T;
}
Run Code Online (Sandbox Code Playgroud)

具体类型应该T是什么?

锈没有c_boollibc箱子的,如果你在网上搜索,你会发现各种GitHub的问题和RFC中,人们讨论这个问题,但真的不来,什么是正确和便携式任何共识:

据我所知:

  • boolC99中的a的大小是未定义的,除了它必须至少足够大以存储true(1)和false(0)的事实.换句话说,至少一位长.
  • 它甚至可能有点宽.
  • 它的大小可能是ABI定义的.

这一评论表明,如果一个C99 bool被传递给函数的参数或出功能的返回值,bool比C的情况下int则提升到相同大小作为int.在这种情况下,我们可以告诉Rust Tu32.

好吧,但如果(由于某种原因)C99 bool是64位宽怎么办?是否u32还安全吗?也许在这种情况下,我们会截断4个最重要的字节,这很好,因为4个最低有效字节足以表示truefalse.

我的推理是否正确?在Rust得到之前libc::c_bool,你将使用什么? …

boolean ffi type-conversion rust

11
推荐指数
1
解决办法
671
查看次数

将“bool”转换为“u8”

以下代码可在 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,但我认为这并不权威。

rust

7
推荐指数
2
解决办法
7823
查看次数

标签 统计

boolean ×2

rust ×2

c ×1

c++ ×1

cpu-architecture ×1

ffi ×1

type-conversion ×1