3 結構體位域大小端總結

2021-09-26 21:15:11 字數 2352 閱讀 1380

結構體內部如果是位域操作,在不同的平台也有大小端的問題。   

1. 案例一分析

小端格式  大端格式

typedef struct yaabou_com yaabou_com_str;

yaabou_com_str str = ;

令:str.c = 1;

str.g = 8;

str.b = 2;

小端格式

記憶體分配:低位元組在前  高位元組在後

單位元組高 單位元組低   單位元組高 單位元組低      單位元組高 單位元組低     單位元組高 單位元組低

ddcccbba                  feeeeedd                       gggfffff                           gggggggg

00001100                 00000000                      00000000                     00000001

0x0c                          0x00                                0x00                              0x01

資料:0x0100000c

大端格式

記憶體分配:高位元組在前 低位元組在後

位元組高段  位元組低段  位元組高段  位元組低段     位元組高段  位元組低段    位元組高段  位元組低段 

abbcccdd                   ddeeeeef                      fffffggg                           gggggggg

01000100                   00000000                    00000000                     00001000

0x44                            0x00                              0x00                             0x08

資料:0x44000008

2. 案例二分析             

小端格式  大端格式

typedef truct test_u16test_u16_type;

test_u16_type str16 = ;

令:str16.b = 1;

str16.c = 2;

str16.a = 1;

小端格式

記憶體分配:低位元組在前  高位元組在後

位元組高段 位元組低段     位元組高段  位元組低段        

cccccccc                      aaabcccc

00000010                    00110000

0x02                             0x30

資料:0x3002

大端格式

記憶體分配:高位元組在前 低位元組在後

位元組高段 位元組低段    位元組高段  位元組低段

cccccccc                     ccccbaaa

00000000                   00101001

0x00                            0x29

資料:0x0029

3. 總結分析

在不同的平台如果要進行轉換,可以通過調換成員的儲存序列達到資料解析的目的。

以上兩個例子的定義分別如下:

案例一大小端定義:

#if cpu_memory_mode == littlemode //bigmode

typedef struct yaabou_com yaabou_com_str;

#endif

#if cpu_memory_mode == bigmode //bigmode

typedef struct yaabou_com yaabou_com_str;

#endif

案例二大小端定義:

#if cpu_memory_mode == littlemode //bigmode

typedef struct test_u16test_u16_type;

#endif

#if cpu_memory_mode == bigmode //bigmode

typedef struct test_u16 test_u16_type;

#endif

另外,針對案例二,網上有帖子說直接調換序列不可行,但是筆者在大小端機型上寫**進行測試,經過驗證是可行的。

同時也請其他網友考證,歡迎交流。

結構體位域

c語言允許在結構體中以位為單位設定成員所佔的記憶體空間。以位為單位的成員,簡稱為位域或位段 bit field 其優點是較少的位數儲存資料從而節省空間,還可以進行記憶體對齊。例如下列結構體內的變數使用了位域,占用空間只有1位元組 8bit 相對於不使用位域的縮少了3位元組 24bit 的資料。str...

c語言結構體位域

位域 有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區...

大小端 位域

小端 低位 lsb 位於低位址 大端 高位 msb 位於低位址 x86一般使用小端模式 位域 typedef union liteu32 t test t 位域的分配 小端 從lsb msb,從低位址到高位址 大端 從msb lsb,從高位址到低位址 例如 test t tt tt.t 0x3f p...