c - C语言编程中的位域

标签 c structure bit-fields

在这段代码中

#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 编译器中,默认情况下 integershort 整数,其大小为 2 字节(16 位)

接下来来到sizeof,您正在尝试打印sizeof结构,这不是所有数据成员的sizeof总和

struct bits的第一个成员是unsigned a : 5,当编译器第一次看到unsigned时,它分配2个字节或 16 位为此,在 16 位中您仅使用5 位,即您仍然可以存储11 位

下一个成员是unsigned b:5,它将在相同的先前内存中提供,因此大小仍然是2字节。到目前为止,内存分配看起来像

----------------------------------------------------------------------
|   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 位,现在 16 位中有多少个待处理的位? 6 位 对吗?您可以在剩余的6位中存储一个char(8位)吗?答案是。因此,剩余的6位将是结构中的漏洞(我显示的是p,它是填充)

接下来对于char c它将再次分配单独的1字节,所以到目前为止2+1 = 3字节

结构的下一个成员是d,它也是整数,因此为此2字节将被分配。因此,将为整个结构分配总共 2+1+ 2 = 5 字节

我希望你明白了。

关于c - C语言编程中的位域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47856934/

相关文章:

c++ - 在 win32/Opengl 中捕获鼠标移动

c++ - 使用 C++ 将 UDP 数据包存储在结构中

java - 在应用程序的整个 Activity 中管理持久视觉数据(事件驱动的按钮和 ImageView )

c - 从 C 中的数据流中读取 n 位元素

c - 非 int 类型的位字段?

c++ - 如何删除xsi :type information from gSoap message?

c - 更改数组中变量的指针

c - C 中的列表 : can't add new elements

c - 通过动态分配的结构变量获取用户输入的字符串

c++ - 结构位域最大大小(C99,C++)