首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C语言中,一个bool (boolean)会占用多少空间?它是1位、1字节还是其他什么?

在C语言中,一个bool (boolean)会占用多少空间?它是1位、1字节还是其他什么?
EN

Stack Overflow用户
提问于 2011-11-05 02:35:43
回答 7查看 85.6K关注 0票数 35

在C语言中,一个bool (boolean)会占用多少空间?它是1位、1字节还是其他什么?程序是32位还是64位有关系吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-11-05 02:38:01

如果您指的是C99 _Bool,请尝试:

代码语言:javascript
运行
复制
printf("%zu\n", sizeof(_Bool)); /* Typically 1. */

请注意,标准是这样写的:

6.2.5

声明为_Bool类型的对象足够大,可以存储值0和1。

大小不能小于一个字节。但是大于一个字节是合法的。

票数 34
EN

Stack Overflow用户

发布于 2011-11-05 02:42:39

C中最小的可寻址“东西”是一个char。C中的每个变量都必须有一个唯一的地址,因此您的bool不能小于这个值。(请注意,char并不总是8位)

票数 9
EN

Stack Overflow用户

发布于 2011-11-05 03:03:26

在较早的C标准中,没有定义这样的类型。然而,许多嵌入式微控制器包括特殊的电路,以允许有效地处理单位标志;一些允许对存储在任何地方的变量进行这种处理,而另一些则仅允许对存储在存储器的特定区域中的变量进行这种处理。用于这样的处理器的编译器允许静态持续时间的各个变量被声明为“位”类型;这样的变量通常只占用一位的存储(如果需要,在可以容纳这种使用的区域内分配)。一些编译器将允许非递归例程的自动变量被声明为“bit”类型,但会默默地将它们视为“静态”(此类编译器提供的链接器要求例程识别它们调用的其他例程,并将拒绝其中未标记为可重入的例程以相互递归的方式相互调用的程序)。

有几点值得注意:

编译器支持“真”位变量的

  1. 处理器通常可以更快地设置、清除或分支这些变量的值,并且使用的代码比设置、清除或分支到字节宽的标志所需的代码更少;
  2. 许多这样的处理器具有非常小的内存量。在许多处理器上,每个变量(与数组元素或结构字段不同)是占用一个位还是一个字节的问题不值得担心。然而,在具有25字节内存的处理器上,16个标志各取一个字节与将所有16个标志合并为两个字节之间存在着巨大的差异。
  3. 至少在我见过的编译器中,位变量不能用作结构字段或数组元素,也不能取一个的地址。

我对C99或更高版本的C或C++标准知之甚少,不知道他们是否有没有地址的独立位类型的概念。我想不出任何理由这样的事情是不可能的,特别是标准已经认识到像结构位字段这样的东西的概念,它的行为很像左值,但没有地址。一些链接器可能不支持这样的变量,但可以通过使它们的实际大小依赖于实现来适应这些链接器(实际上,除了程序速度或总内存使用之外,不可能区分这些变量分别是1位还是64位)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8014161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档