结构体的大小及结构体之位域

结构体的大小:

规则1:结构体的大小等于结构体内最大成员大小的整数倍

规则2:结构体内的成员的首地址相当于结构体首地址的偏移量是其类型大小的整数倍

规则3:为了满足规则1和2在结构体成员之后进行字节填充

 

结构体位域的大小规则:

结构体的大小及结构体之位域

 

最后一点:

#include <stdio.h>

struct GPIOF{
    unsigned int d:4;
    unsigned int a:1;
    unsigned int b:1;
    unsigned int c:1;
    unsigned int res:25;
};

int main(){
    struct GPIOF led = {0, 1, 0, 1, 0};
    
    printf("%d %x\n", led, led.a);
    
    led.a = 0;
    printf("%x %d\n", led, led.a);
    
    return 0;

在嵌入式中最好设它为无符号整型。

当设它为有符号整数时:

struct GPIOF{
     int d:4;
     int a:1;
     int b:1;
     int c:1;
     int res:25;
};
输出结构等于 80 ffffffff(十六进制)

                      40 0

因为赋值时,比如led.a=1;

剩下位补1 因为为有符号int(其实等于-1)

还不知道为什么,如果要取正确的位数就要&结构体成员的位数

所以尽量用unsigned.