小端对齐与大端对齐
1)小端对齐(Little-endian):将低序字节存储在低位地址(低位编址)
2)大端对齐(Big-endian):将高序字节存储在低位地址(高位编址)
比如一个数据 0x12345678,地址 0x8000 为起始地址,当使用小端对齐时,0x8000 存储数据 0x78,存储低位数据;当使用大端对齐时,0x8000 存储数据 0x12,存储高位数据
判断大小端
- 强制转换
BOOL IsBigEndian()
{
int a = 0x1234;
char b = *(char *)&a; //通过将int强制类型转换成char单字节,通过判断起始存储位置。即等于 取b等于a的低地址部分
if( b == 0x12)
{
return TRUE;
}
return FALSE;
}
- 联合体
BOOL IsBigEndian()
{
union NUM
{
int a;
char b;
}num;
num.a = 0x1234;
if( num.b == 0x12 )
{
return TRUE;
}
return FALSE;
}
内存对齐
内存对齐满足一下三条规则:
-
数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储
-
结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储
-
收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍
#pragma pack(1)
告诉编译器,所有的对齐都按照1的整数倍对齐
#pragma pack(push) //保存对齐状态
#pragma pack(4)//设定为4字节对齐
struct test
{
char m1;
double m4;
int m3;
};
#pragma pack(pop)//恢复对齐状态
标签:存储,int,成员,char,地址,大小,对齐
From: https://www.cnblogs.com/augustine0654/p/18278931