其他参考文献:
完美解析C语言memcpy函数的用法
C 库函数 calloc()
位域定义结构如下:
struct 位域结构名{
类型说明符 位域名a:位域长度;
……
类型说明符 位域名b:位域长度;
};
一、打印位域的操作结果
#pragma pack(push, 1)
typedef struct ST_TEST
{
unsigned char ucA : 1;
unsigned char ucB : 1;
unsigned char ucC : 1;
unsigned char ucD : 1;
unsigned char ucE : 1;
unsigned char ucF : 1;
unsigned char ucG : 1;
unsigned char ucH : 1;
} ST_TEST;
#pragma pack(pop)
#include <string.h>
#include <stdio.h>
int main(void)
{
ST_TEST stTest;
/*与操作赋值*/
stTest.ucA = 1;
stTest.ucB = 0;
stTest.ucC = 0;
stTest.ucD = 0;
stTest.ucE = 0;
stTest.ucF = 0;
stTest.ucG = 1;
stTest.ucH = 0;
unsigned char ucTest;
/*从stTest的开始位置拷贝1个字节的数据到ucTest*/
memcpy(&ucTest, &stTest, 1);
/*没有现成的打印二进制的方法,所以用16进制打印*/
printf("==========%x\n", ucTest);
system("pause");
return 0;
}
二、位域字节数与初始地址
#include <stdio.h>
struct data_ {
char a : 5;
char b : 6;
char c : 7;
}data;
int main()
{
printf("data 的起始地址是:%p\n",&data);
printf("data 的占有的字节数:%d\n",sizeof(struct data_));
}
执行结果:
data 的起始地址是:003D918C
data 的占有的字节数:3
位域字节按8位为一字节计算,所以2<(5+6+7)/8=18/8<3,字节多余2个只能将字节按3字节计算。