请解释一下这段代码是如何执行的。为什么我们在结构中使用":"。冒号在结构中的用是什么。sizeof 运算符的输出应该是什么。
#include <stdio.h>
int main()
{
struct bitfield {
signed int a : 3;
unsigned int b : 13;
unsigned int c : 1;
};
struct bitfield bit1 = { 2, 14, 1 };
printf("%ld", sizeof(bit1));
return 0;
}
它是位字段语法的一部分。 这里意味着a
占用 3 位,b
13 位,c
仅占用 1 位。 当然,该结构不会只占用内存中的 17 位,因为它必须与字节对齐作为最小的可寻址内存单元,因此sizeof(bit1)
至少为 3 个字节(可能它将与与机器字相关的某个值对齐,例如 4 个字节(。 您可以在此处阅读有关对齐方式的更多信息:结构填充和包装。 我假设 1 字节是 8 位大小,但有一些旧的或奇特的架构,其中字节有另一个大小。
:
运算符用于位字段,即使用较大空间的指定位数的整数值。这些可能会打包到机器字中以节省空间,但实际行为是实现定义的。
现在,"sizeof 运算符的输出应该是什么"这个问题很简单,但答案很复杂。
sizeof
运算符说它返回字节数,但"字节"的定义不一定是你认为的那样。一个字节必须至少为 8 位,但可以更多。9、12 和 16 位并非闻所未闻。
给定平台的sizeof(int)
可能因体系结构字大小而异。假设字节大小为 8 位,则sizeof(int)
可能是 2、4 或 8。可能更多。字节大小为 16 时,sizeof(int)
实际上可能是 1。
现在,还记得我说过位字段是否打包取决于实现吗?好吧,这将在这里产生很大的不同。每个位字段都可以放入一个单独的单词中。或者它们可能全部打包成一个。
最有可能的是,您使用的是具有 8 位字节和 32 或 64 位int
s 的英特尔平台,编译器可能会打包位字段。因此,您的sizeof(bit1)
可能是 4 或 8。