結構體struct union 大端小段

2021-08-07 12:52:36 字數 2449 閱讀 7641

1:大端與小端?與尋常習慣的區別? 

大端:高位址儲存低位位元組。

小端:低位址儲存低位位元組。

如對於資料0x1234,其32位為0x00001234。 

對於大端來說:(位址由低到高儲存)00 00 12 34 

對於小端來說:(位址由低到高儲存)34 12 00 00 

由此可以得出結論:大端的儲存方式與尋常習慣相一致,而小端的儲存方式為按照位元組倒排。

在乙個64位的作業系統中定義如下結構體:

1

2

3

4

5

6

structst_task

;

同時定義fool函式如下:

1

2

3

4

5

6

7

voidfool()

;

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 結構體型別所占用的記憶體空間是最大資料型別的整數倍。因為結構體型別的變數在分配記憶體時有記憶體...