C编程中的位域
bit fields in c programming
在此代码中
#include<stdio.h>
void main()
{
struct bits{
unsigned a:5;
unsigned b:5;
char c;
int d;
} bit1;
printf("%d",sizeof(bit1));
}
输出是5
请解释5是怎么来的
您似乎正在使用 Turbo C(windows)
。在 TurboC
编译器中,默认情况下 integer
是 short
整数,即 2 bytes(16 bits)
.
接下来是 sizeof
,您正在尝试打印 sizeof 结构,这没什么 sum of sizeof all data member
。
struct bits
的第一个成员是 unsigned a : 5
,当编译器首先看到 unsigned
时,它为此分配了 2 bytes or 16 bits
,out of 16 bits
你正在使用只有 5 bits
即你仍然可以存储 11 bits
.
下一位成员是 unsigned b:5
,这将在 same previous memory
后送达,所以仍然是 2 bytes
。到目前为止内存分配看起来像
----------------------------------------------------------------------
| p | p | p | p | p | p | b | b | b | b | b | a | a | a | a | a |
----------------------------------------------------------------------
0x115 0x114 0x113.. ........ 0x100
MSB LSB
a means for a 5 bits
b means for b 5 bits
p means padding or wastage.
如果你分析上图,a的前5位,b的后5位,现在有多少pending out 16 bits
? 6 bits
对吗?你能不能在剩余的 6 bits
中存储一个 char(8 bit)
,答案是 No
。所以剩下的 6 bits will be holes in structure
(我显示的是 p
即 padding
)
所以接下来 char c
它将再次分配单独的 1 bytes
,所以到现在为止 2+1 = 3 bytes
.
结构的下一个成员是 d
,它也是整数,因此将为此分配 2 byte
s。所以总共 2+1+ 2 = 5 bytes
将分配给整个结构。
我希望你明白了。
在此代码中
#include<stdio.h>
void main()
{
struct bits{
unsigned a:5;
unsigned b:5;
char c;
int d;
} bit1;
printf("%d",sizeof(bit1));
}
输出是5
请解释5是怎么来的
您似乎正在使用 Turbo C(windows)
。在 TurboC
编译器中,默认情况下 integer
是 short
整数,即 2 bytes(16 bits)
.
接下来是 sizeof
,您正在尝试打印 sizeof 结构,这没什么 sum of sizeof all data member
。
struct bits
的第一个成员是 unsigned a : 5
,当编译器首先看到 unsigned
时,它为此分配了 2 bytes or 16 bits
,out of 16 bits
你正在使用只有 5 bits
即你仍然可以存储 11 bits
.
下一位成员是 unsigned b:5
,这将在 same previous memory
后送达,所以仍然是 2 bytes
。到目前为止内存分配看起来像
----------------------------------------------------------------------
| p | p | p | p | p | p | b | b | b | b | b | a | a | a | a | a |
----------------------------------------------------------------------
0x115 0x114 0x113.. ........ 0x100
MSB LSB
a means for a 5 bits
b means for b 5 bits
p means padding or wastage.
如果你分析上图,a的前5位,b的后5位,现在有多少pending out 16 bits
? 6 bits
对吗?你能不能在剩余的 6 bits
中存储一个 char(8 bit)
,答案是 No
。所以剩下的 6 bits will be holes in structure
(我显示的是 p
即 padding
)
所以接下来 char c
它将再次分配单独的 1 bytes
,所以到现在为止 2+1 = 3 bytes
.
结构的下一个成员是 d
,它也是整数,因此将为此分配 2 byte
s。所以总共 2+1+ 2 = 5 bytes
将分配给整个结构。
我希望你明白了。