1.字节对齐
int main()
{
#pragma pack(1)
struct test {
char a;
short b;
int c;
long d;
};
const testLen=sizeof(test);
return 0;
}
如果程序前面加上#pragma pack(1)则程序为1字节对齐,得到(1+2+4+8)=15,如果不加的话,则需要保证结构体每个元素都要数据对齐,因此必须在a和b之间插入1字节的间隙使得后面的short元素2字节对齐int元素4字节对齐long元素8字节对齐,这样最终test结构大小为16字节。
2.移位操作
#include<iostream>
struct testStr
{
unsigned short IPAddressParam; //2
unsigned char MUZHIDataLen; // 1
unsigned char MUZHINum; // 1
unsigned short targetFW; //2
unsigned short targetFY; //2
unsigned short targetDistance; //2
};
struct testStrReplace
{
unsigned short IPAddressParam; //2
unsigned char MUZHIDataLen; // 1
unsigned char MUZHINum; // 1
unsigned short targetFWD :8,
targetFWG :8;//2
unsigned short targetFY; //2
unsigned short targetDistance; //2
};
int main()
{
testStr test;
testStrReplace testR;
const unsigned short fw = 9200;
//要求低位在前,高位在后
//转化为16位 fw&0xff 表示低8位,然后左移8位,得到低8位;
//fw右移8位,然后&0xff,得到高8位
test.targetFW = ((fw & 0xff) << 8) | ((fw >> 8) & 0xff);
//这种写法比较简单,不用移位操作
testR.targetFWD = fw & 0xff;
testR.targetFWG = (fw >> 8) & 0xff;
}