c编程中的位字段

问题描述 投票:-4回答:1

这里是这段代码

#include<stdio.h>
void main()
{
    struct bits{
        unsigned a:5;
        unsigned b:5;
        char c;
        int d;
    } bit1;

    printf("%d",sizeof(bit1));
}

输出是5 请解释5是怎么来的

c structure bit-fields
1个回答
1
投票

好像你在使用Turbo C(windows)。在TurboC编译器默认情况下integershort整数,它是2 bytes(16 bits)

接下来来sizeof,你正在尝试打印sizeof结构,这是什么sum of sizeof all data member

struct bits的第一个成员是unsigned b : 5,当编译器首先看到unsigned它为此分配2 bytes or 16 bitsout 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.

如果你分析上面的数字,前5位为a,接下来5位为b,现在有多少未决的16 bits6 bits对吗?你可以在剩下的char(8 bit)存储6 bits,答案是No。所以剩下的6 bits will be holes in structure(我展示的是p,这是padding

所以接下来对于char c它将再次分配单独的1 bytes,所以直到现在2+1 = 3 bytes

结构的下一个成员是d,它也是整数,所以为此,将分配2 bytes。所以总的2+1+ 2 = 5 bytes将分配给整个结构。

我希望你明白了。

© www.soinside.com 2019 - 2024. All rights reserved.