结构中的位域概念
Bitfield concept in structure
#include<stdio.h>
int main()
{
struct value
{
int bit1:1;
int bit2:4;
int bit3:4;
}bit;
printf("%d\n",sizeof(bit));
}
我正在使用 GCC,它显示 sizeof(bit)
值为 4。您能解释一下它的内部工作原理吗?
编译器决定将位域布置在单个 int
中,这在您的平台上是 32 位。这意味着整个结构需要 32 位,即使结构的可用部分更小。
大多数机器都不能位寻址,所以它真的不能创建 9 位宽的对象。它本可以选择 16 位,并且您可以使用一些 #pragma
或 attribute
魔法说服它这样做。 32 位可能是提供最佳性能的最原始大小。
引用 C11
标准,第 §6.7.2.1
章,结构和联合说明符,(强调我的)
implementation may allocate any addressable storage unit large enough to hold a bitfield. If enough space remains, a bit-field that immediately follows another bit-field in a structure shall be packed into adjacent bits of the same unit. If insufficient space remains, whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is implementation-defined.....
在你的例子中,由于(第一个变量类型)int
大小足以将所有位域变量打包成一个 int
,它正在这样做。
因此,基本上您的 sizeof(bit)
等同于 sizeof(int)
,在 32 位系统中可能会产生值 4
。
就是说,sizeof
产生一个 size_t
类型的值。您应该使用 %zu
格式说明符来打印该值。
[由社区编辑添加]
案例一:
如果您使用 char
如下所示,它将显示大小为 1
,因为 7 位可以放入 char
.
#include<stdio.h>
int main(void)
{
struct value
{
char bit1:1;
char bit2:2;
char bit3:4;
}bit;
printf("%d\n",sizeof(bit));
}
案例二:
在下面的例子中,结果将为“2”,因为它需要 2 char
s 来存储总共 9
位。
char bit1:1;
char bit2:4;
char bit3:4;
#include<stdio.h>
int main()
{
struct value
{
int bit1:1;
int bit2:4;
int bit3:4;
}bit;
printf("%d\n",sizeof(bit));
}
我正在使用 GCC,它显示 sizeof(bit)
值为 4。您能解释一下它的内部工作原理吗?
编译器决定将位域布置在单个 int
中,这在您的平台上是 32 位。这意味着整个结构需要 32 位,即使结构的可用部分更小。
大多数机器都不能位寻址,所以它真的不能创建 9 位宽的对象。它本可以选择 16 位,并且您可以使用一些 #pragma
或 attribute
魔法说服它这样做。 32 位可能是提供最佳性能的最原始大小。
引用 C11
标准,第 §6.7.2.1
章,结构和联合说明符,(强调我的)
implementation may allocate any addressable storage unit large enough to hold a bitfield. If enough space remains, a bit-field that immediately follows another bit-field in a structure shall be packed into adjacent bits of the same unit. If insufficient space remains, whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is implementation-defined.....
在你的例子中,由于(第一个变量类型)int
大小足以将所有位域变量打包成一个 int
,它正在这样做。
因此,基本上您的 sizeof(bit)
等同于 sizeof(int)
,在 32 位系统中可能会产生值 4
。
就是说,sizeof
产生一个 size_t
类型的值。您应该使用 %zu
格式说明符来打印该值。
[由社区编辑添加]
案例一:
如果您使用
char
如下所示,它将显示大小为1
,因为 7 位可以放入char
.#include<stdio.h> int main(void) { struct value { char bit1:1; char bit2:2; char bit3:4; }bit; printf("%d\n",sizeof(bit)); }
案例二:
在下面的例子中,结果将为“2”,因为它需要 2
char
s 来存储总共9
位。char bit1:1; char bit2:4; char bit3:4;