1、字节对齐问题:
#pragma pack(4)
typedef struct _S_1
{
char a;
long b;
char c;
}S_1;
#pragma pack()
#pragma pack(2)
typedef struct _S_2
{
char a;
S_1 b;
long c;
char d;
}S_2;
#pragma pack()
展开,上面有两个pack(N),随意修改这个N,结果又会是什么?例如:一个是1,一个是4,两个都是4,两个都是1,或者其它任意组合,结果是多少?
最简单的方法是上机去试试,但也要明白原理!
2、位域问题:
#pragma pack(1)
typedef union _Message
{
long Result;
struct _Data
{
char a;
short b:1;
short c:2;
short d:3;
short e:4;
short f:6;
char g;
}Data;
} Message;
#pragma pack()
int main()
{
Message m_msg;
m_msg.Data.a = 0x01;
m_msg.Data.b = 0x02;
m_msg.Data.c = 0x03;
m_msg.Data.d = 0x04;
m_msg.Data.e = 0x05;
m_msg.Data.f = 0x06;
m_msg.Data.g = 0x07;
//printf("%d\n",sizeof(Message));
printf("%0.8X\n",m_msg.Result);
return 0;
}
问:在小字节序下,结果是多少?在大字节序下,结果又是多少?typedef union _Message
{
long Result;
struct _Data
{
char a;
short b:1;
short c:2;
short d:3;
short e:4;
short f:6;
char g;
}Data;
} Message;
#pragma pack()
int main()
{
Message m_msg;
m_msg.Data.a = 0x01;
m_msg.Data.b = 0x02;
m_msg.Data.c = 0x03;
m_msg.Data.d = 0x04;
m_msg.Data.e = 0x05;
m_msg.Data.f = 0x06;
m_msg.Data.g = 0x07;
//printf("%d\n",sizeof(Message));
printf("%0.8X\n",m_msg.Result);
return 0;
}
如果不明白什么是字节序,那就直接回答,在Intel的CPU下结果是多少就行了。
注意:这里必须使用pack(1),否则结果并不是预期的样子。而且b,c,d,e,f,必须定义成short,如果不是short是其它的数据类型,结果又会不一样!
两个问题都可以在VC下进行测试,有兴趣的自己动手试试,体会一下!
第二题无法演示在大字节序下的情况,因此无法演示结果,只能看理论上解答!
答案(最好是自己理论求解再来用VC来验证):
1:20
2:07196601(小字节序);01714607(大字节序)
应用场景:不要觉得这样的题目很变态,实际上它的应用场景是很多!
例如一个以太网的帧格式,它有2个48bit的MAC地址,还有一些报文类型,用4个bit来表示,还有其它的一些信息,都不是用byte来表示的,而是用几个bit表示。如何定义这样的以太网帧格式,就会与上面的问题相关了。而且网络中传输的数据是采用的大字节序,而我们一般的PC机,或者说是兼容Intel CPU的机器,都是小字节序,所以要注意转化一下,否则定义出来的结构也并不是我们想要的。
而字节对齐的应用在网络的消息报文中也经常遇到。但一般情况下都是采用的自然对齐,这样在网络中进行数据交换时,如果采用的对齐方式不一致,可能出现数据对齐的问题。