問題引出: 計算機大端小端之爭。
1)little-endian就是低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端。
2) big-endian就是高位位元組排放在記憶體的低位址端,低位位元組排放在記憶體的高位址端。
數字0x12345678 在大端小端的儲存方式
1)大端模式:
低位址 -----------------> 高位址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低位址 ------------------> 高位址
0x78 | 0x56 | 0x34 | 0x12
記憶體位址
小端模式存放內容
大端模式存放內容
0x4000
0x78
0x12
0x4001
0x56
0x34
0x4002
0x34
0x56
0x4003
0x12
0x78
大端小端的pro and con
小端: 強制型別轉化時候比較方便; 大端判斷符號型別比較方便。
實際中:
作業系統使用小端,網路程式使用大端; 硬體
big endian: powerpc, sun, ibm;
little endian: intel, dec
arm既可以大端也可以小端。
如何判斷是大端還是小端
void test_1()
else /*如果是0x 34 12小端,強制轉化了則b 為0x34*/
} 其他辦法,因為c語言的聯合的各個成員會共享一塊記憶體,所以是否可以通過聯合體來判斷。
typedef unsigned char byte;
void test_2()
else /* 0x ff 00 00 00*/
} 看看linux 如何判斷大端小端的
static union
linuxendiantest = };
#define linuxendian ((char) linuxendiantest.l)
void test_4()
實際的應用:
在微控制器程式設計中,聯合體和位域結合,可以實現對led的控制
有時候既想操作整個位元組 顯示乙個數,也想控制某位閃爍。
定義如下的聯合體
typedef union u***t***;
}u***;
//-------uf1-------------------
#define ufg1 uf1.***
//可以操作位
#define f_led1 uf1.t***.***1
#define f_led2 uf1.t***.***2
#define f_led3 uf1.t***.***3
ufg1 = 0x88;
f_led1 = 0x01;
網路協議中,不同的報文型別packagetype,不同的報文內容packagecontent,使用同乙個結構表示。
typedef union tagpackagecontent
; typedef struct packagestructure
結構體與聯合體
結構體和聯合體 圖見筆記 一.結構體概念 結果虛擬記憶體 對映到物理記憶體 二.結構體長度 三.結構體陣列 指標陣列 四.簡易通訊錄 定義開始頁面 區域性函式 1.增加使用者資訊 2.修改使用者資訊 3.查詢資訊 4.刪除資訊 5.顯示資訊 6.執行 五.聯合體的概念 結果六.判斷大小端 面試 七....
結構體與聯合體
目錄結構 聯合 區別 結構 是一種構造型別,它是由若干 成員 組成的。每乙個成員可以是乙個基本資料型別或者是另乙個構造型別。結構在說明和使用之前必須先定義。格式 struct 結構名 結構變數 結構名是結構的識別符號。結構成員的型別可以為整型 浮點型 字元型 指標型等資料型別,或者是另乙個構造型別。...
結構體聯合體
在c中,結構也是一種資料型別,可以使用結構變數,因此,象其它型別的變數一樣,在使用結構變數時要先對其定義。定義結構變數的一般格式為 struct 結構名 結構變數 結構名是結構的識別符號不是變數名。型別為第二節中所講述的五種資料型別 整型 浮點型 字元型 指標型和無值型 構成結構的每乙個型別變數稱為...