位域的几个迷惑点
1、占用大小sizeof :记住类型长度bit数,不够就新开一个,不沾上一个。
2、涉及与平台大小端关系,特别是应用到网络报文中时容易搞错。
参考博文
结构体位域在内存中的分布与平台大小端的关系
https://blog.youkuaiyun.com/qiuzhizhecsd/article/details/75144275
C位域与大小端字节序 间关系
https://blog.youkuaiyun.com/feng2008ao/article/details/51476958
C语言面试题——位域及大小端模式的理解
https://blog.youkuaiyun.com/liming0931/article/details/7721390
网络相关的结构体位域定义
1、多字节的大多不会出现跨字节的定义,但也有部分是跨字节定义
2、结构体位域是多字节的定义顺序倒换仅仅是在字节内倒换
struct ieee802154_hdr_fc {
#if defined(__LITTLE_ENDIAN_BITFIELD)
u16 type:3,
security_enabled:1,
frame_pending:1,
ack_request:1,
intra_pan:1,
reserved:3,
dest_addr_mode:2,
version:2,
source_addr_mode:2;
#elif defined(__BIG_ENDIAN_BITFIELD)
u16 reserved:1,
intra_pan:1,
ack_request:1,
frame_pending:1,
security_enabled:1,
type:3,
source_addr_mode:2,
version:2,
dest_addr_mode:2,
reserved2:2;
#else
#error "Please fix <asm/byteorder.h>"
#endif
};
关于bit位域和大小端的理解
实验结构体中,存在跨位域的定义,赋值
typedef struct little_endian{
int G:11;
int F:6;
int E:5;
int D:4;
int C:3;
int B:2;
int A:1;
}little_endian
typedef struct big_endian{
int A:1;
int B:2;
int C:3;
int D:4;
int E:5;
int F:6;
int G:11;
}big_endian;
经过赋值后,读出的值是一样的了,而由于系统大小端区别,内存中看到的顺序刚好是相反的。