C語言筆記----2012年計算機聯考真題

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】趙海英教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章