1.字节对齐
#pragma pack(1) // 1字节对齐
#pragma pack() // 取消字节对齐
2.位域
以下面的16位寄存器为例
struct TIMx_CTRL1
{
unsigned short cnten:1;
unsigned short updis:1;
unsigned short uprs:1;
unsigned short onepm:1;
unsigned short :3; //空域
unsigned short arpen:1;
unsigned short :8; //空域
}data_bits;
3.共用体
共用体是一种数据类型,实现在相同的位置存储不同的数据类型,但是在某一时刻只能保存一种数据。
#include <stdio.h>
union data{
int n;
char ch;
short m;
};
int main(){
union data a;
printf("%d, %d\n", sizeof(a), sizeof(union data) );
a.n = 0x40;
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
a.ch = '9';
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
a.m = 0x2059;
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
a.n = 0x3E25AD54;
printf("%X, %c, %hX\n", a.n, a.ch, a.m);
return 0;
}
运行结果:
4, 4
40, @, 40
39, 9, 39
2059, Y, 2059
3E25AD54, T, AD54
4.位域和共用体联合使用
#include <stdio.h>
#pragma pack(1) // 1字节对齐
typedef union
{
struct TIMx_CTRL1
{
unsigned short cnten:1; // 0bit
unsigned short updis:1; // 1bit
unsigned short uprs:1; // 2bit
unsigned short onepm:1; // 3bit
unsigned short :3; // 4_6bit空域
unsigned short arpen:1; // 7bit
unsigned short :8; // 8_15bit空域
}data_bits;
unsigned short tinx_ctrl1;
}tinx_ctrl1_t;
#pragma pack() // 取消字节对齐
int main()
{
tinx_ctrl1_t test;
test.data_bits.cnten = 1;
test.data_bits.uprs = 1;
test.data_bits.arpen = 1;
printf("TIMx_CTRL1 = 0X%X \n",test.tinx_ctrl1);
return 0;
}
运行结果:
TIMx_CTRL1 = 0X85