最近學習C語言知識,從網上收集了一些內容,自己也總結了一些,感覺這幾題有點意思,有興趣的可以自己試試:
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()
問:sizeof(S_2)為多少?
展開,上面有兩個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;
}
問:在小位元組序下,結果是多少?在大位元組序下,結果又是多少?
如果不明白什麼是位元組序,那就直接回答,在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的機器,都是小位元組序,所以要注意轉化一下,否則定義出來的結構也並不是我們想要的。
而位元組對齊的應用在網路的訊息報文中也經常遇到。但一般情況下都是採用的自然對齊,這樣在網路中進行資料交換時,如果採用的對齊不一致,可能出現資料對齊的問題。