作業系統的大小端模式

2021-10-06 08:56:41 字數 2250 閱讀 4359

什麼是大小端模式

大小端儲存由

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是高位位元組 所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順...

大小端模式

所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址中...