什麼是大小端模式
大小端儲存由
cpu架構 決定。
大端模式(big endian
小端模式(little endian
例如:使用大端模式的有:mac os、powerpc、ibm、sun、
tcp/ip網路資料流;
使用小端模式的有:x86、linux;
而arm可以是大端模式,也可以是小端模式;
如何判斷cpu是大端模式還是小端模式
// liunx核心的方法
void check_cpu_mode_1()
endian_test = };
#define endianness ( (char)endian_test.mylong )
if ( 'b' == endianness )
printf(" it's big endian\n");
else
printf("it's little endian\n");
}// 指標方法
void check_cpu_mode_2()
用巨集實現大小端轉換
/* 定義多行巨集時在每一行後面加 '\' */
//對於16位資料
#define bigtolittle16(a) (( ((uint16)(a) & 0xff00) >> 8)| \
(( (uint16)(a) & 0x00ff) << 8))
//對於32位資料
#define bigtolittle32(a) ((( (uint32)(a) & 0xff000000) >> 24) | \
(( (uint32)(a) & 0x00ff0000) >> 8) | \
(( (uint32)(a) & 0x0000ff00) << 8) | \
(( (uint32)(a) & 0x000000ff) << 24))
陣列在大小端情況下的儲存情況
若存在unsigned int value = 0x12345678,用unsigned char buf[4]來表示value,則
例題1
假設在乙個 32 位 little endian 的機器上執行下面的程式,結果是多少?
#include
int main()
輸出結果為:1,0,2
小端模式,a端為低位址,c端為高位址,long long 為8位元組,a=0x01,b=0x02,c=0x03
注:printf()是乙個庫函式,c,c++中函式的引數是從右往左入堆疊的,再彈出;%d格式輸出的是4個位元組大小,
小端模式
0x03
c
0
3
0x02
b
0
2
0x00
a
0
1
若存在資料 a = 305419896,十六進製制表示為:0x12345678
大端模式
記憶體位址
hex數字
0x03
78
0x02
56
0x01
34
0x00
12
乙個位元組位址空間佔8個位(bit),而乙個十六進製制資料位佔4位(bit),
所以乙個記憶體位址可以存兩個十六進製制資料位
例題2
int main()
unsigned int 為4個位元組, 1024 = 0x0000 0400
小端模式
大端模式
高位址 00
00 00
04 04
00
低位址00 00
判斷系統大小端模式
端模式 endian 的這個詞出自jonathan swift書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為big endian,從尖頭開始將雞蛋敲開的人被歸為littile endian。小人國的內戰就源於吃雞蛋時是究竟從大頭 big endi...
大小端模式
偶 注意 大小端的高低位資料是按位址來計算的。如0x1001,10是高位位元組,01是低位位元組。char s abcd a是高位位元組 所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順...
大小端模式
所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址中...