C語言筆記【2】
知識點:
1、結構體佔字節數
2、小端地址與大段地址
3、 邊界對齊方式存儲
【2012年計算機聯考真題】
某計算機存儲器按字節編址,採用小端方式存放數據,假定編譯器規定int和short型長度分別爲32位和16位,並且數據按邊界對齊存儲,其C語言程序段如下:struct{
int a;
char b;
short c;
}record;
record.a=273;若record變量的首地址爲0xC008,則地址0xC008中的內容及record.c的地址分別爲( )
A . 0x00 0xC00D
B . 0x00 0xC00E
C . 0x11 0xC00D
D . 0x11 0xC00E
【答案】 D
分析:
【1】存儲器按字節編制。
record------結構體變量-----佔所有字節數之和。
類型 | 字節數 |
---|---|
int a | 4 |
char b | 1 |
short c | 2 |
record | 4+2+1=7 |
本來record應該是佔得7個字節,如果這一題沒有其他限制的話。
但是這一題出現了數據按邊界對齊存儲的條件,事實上,record佔得是8個字節(需要後續分析才知道)。
結構體變量 | 字節數 |
---|---|
record | 8 |
【2】小端方式和大端方式
1、大端方式:數據高字節—>內存的低地址;數據低字節---->內存的高地址。
1、小端方式:數據高字節—>內存的高地址;數據低字節---->內存的低地址。
如果廣義成一個二進制對象,大端法對應的就是從頭到尾存儲,小端法就是從尾到頭。
【3】數據按邊界對齊存儲
通俗的來說,變量的起始地址爲其大小的整數倍,比如short佔2個字節,起始地址從偶數地址開始。
比較官方的定義爲:即對於存放某長度爲 m 字節的數據,存放首地址需爲m 字節的整數倍,同時,結構體整體的大小是最大成員長度的整數倍。
如上圖所示,在採用邊界對齊的情況下,當處理器需要訪問a_變量和b_變量時都只需進行一次存取(圖中花括號表示一次存取操作)。若不採用邊界對齊,a_變量只要一次處理器操作,而b_變量卻至少要進行兩次操作。對於b_,處理器還得調用更多指令將其合成一個完整的 4 字節,這樣無疑大大降低了程序效率。
【解題步驟】
1、273=0x111=0x 00 00 01 11(化成32位)
2、內存中的存儲
地址 | 數據(0x) |
---|---|
0xC008 | 11 (record.a) |
0XC009 | 01 (record.a) |
0XC00A | 00 (record.a) |
0XC00B | 00 (record.a) |
0XC00C | record.b |
0XC00D | ----- |
0XC00E | record.c |
0XC00F | record.c |
爲什麼0XC00D不能直接存放record.c?
這就是前面所說的數據按照邊界對齊方式存儲的規則,0XC00D,D化成十進制爲13,不能整除2字節(record.c),因此後放。
參考:
【1】https://blog.csdn.net/runner_of_nku/article/details/82883245
【2】https://blog.csdn.net/weixin_37641832/article/details/89075718?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
【3】趙海英教程