1:大端與小端?與尋常習慣的區別?
大端:高位址儲存低位位元組。
小端:低位址儲存低位位元組。
如對於資料0x1234,其32位為0x00001234。
對於大端來說:(位址由低到高儲存)00 00 12 34
對於小端來說:(位址由低到高儲存)34 12 00 00
由此可以得出結論:大端的儲存方式與尋常習慣相一致,而小端的儲存方式為按照位元組倒排。
在乙個64位的作業系統中定義如下結構體:
1
2
3
4
5
6
struct
st_task
;
同時定義fool函式如下:
1
2
3
4
5
6
7
void
fool()
;
uint64_t a = 0x00010001;
memcpy
(&task, &a,
sizeof
(uint64_t));
printf
(
"%11u,%11u,%11u"
, task.id, task.value, task.timestamp);
}
上述fool()程式的執行結果為()
首先在記憶體中是小端儲存方式存放位元組。
uint16_t id;//兩個位元組,16位,
佔2個 位元組
uint32_t value;//4個位元組,32位,
佔4個位元組
uint64_t timestamp;//8個位元組,64位,
佔8個位元組
0x00010001十六進製制,共32位
id(16bits)+16bits+value(32bits)=64位,
以8位元組位元組對齊需要
按照低位儲存:
則id(16bits)+16bits會佔據掉32bits的 0x00010001,id佔據掉ox0001,因此為1
id和value佔第一行8位元組,timestamp佔第二行8個位元組。 故
memcpy
複製8個位元組的資料後,timestamp是沒有值的。
uint64_t a = 0x00010001是8個位元組,故在64位系統中是佔了一行,只賦值給第一行資料。
所以id占用01 00; value 占用00 00 00 00;timestamp沒有值 ;
對struct進行sizeof操作
對於乙個struct取sizeof,要考慮對界的問題。對界是取struct中最大的資料作為對界值。對於以下三個struct,有以下解答
struct s1
;//sizeof(struct s1)=1+7+8+4+1+3=24;對界值取8(7,3是為滿足對界填充的空間)
struct s2
;//sizeof(struct s2)=1+1+2+4+8=16;對界值取8(2是為滿足對界填充的空間)
struct x
;//sizeof(struct x)=2+2+4+1+3=12;對界值取4(第二個2和3是為滿足對界填充的空間)
union資料型別占用的空間
union u //8對齊
;union u2 //4對齊
;union u3 //1對齊
;cout
<
cout
<
cout
<
都知道union的大小取決於它所有的成員中,占用空間最大的乙個成員的大小。所以對於u來說,大小就是最大的double型別成員a了,所以sizeof(u)=sizeof(double)=8。但是對於u2和u3,最大的空間都是char[13]型別的陣列,為什麼u3的大小是13,而u2是16呢?關鍵在於u2中的成員int b。由於int型別成員的存在,使u2的對齊方式變成4(4位元組對齊),也就是說,u2的大小必須在4的對界上,所以占用的空間變成了16(最接近13的對界)。
結構體型別 結構體變數 結構體陣列 結構體指標
問題1 一元錢換為1 2 5分的硬幣,有多少種兌換方?本題要點分析及參 對各種可能情況進行一一測試。這是實現迴圈的一種方式 窮舉法 但實際上只有只有餘額才能兌換成其它面值的硬幣 main 注意換行的控制和每列的對齊 問題3 某鐵路線上有10個站,需要準備多少種客票?main b a 0 p prin...
LARGE INTEGER 大整數結構體的解析
在 winnt.h 檔案中定義了乙個結構體large integer,十分巧妙 if defined midl pass typedef struct large integer dummystructname struct u endif midl pass longlong quadpart l...
結構體 結構體陣列
void test 函式遞迴呼叫 允許函式體裡再次呼叫函式本身 使用遞迴一定要有出口 long fact int n return n fact n 1 定義乙個新的資料型別 struct mypoint 結構體型別所占用的記憶體空間是最大資料型別的整數倍。因為結構體型別的變數在分配記憶體時有記憶體...