大小端的判斷及轉換

2021-09-13 21:49:47 字數 2401 閱讀 8929

大端模式:是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;這和我們的閱讀習慣一致。

小端模式:是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低。

(1)為什麼會有大小端之分?

因為在計算機系統中,是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為 8bit. 在c中除了char的8位,short的16位(具體大小多少要看編譯器,就像32位和64位系統,所佔大小是不一樣的),另外對於位數大於8 位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如何將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。

例如乙個16bit的short x,若在記憶體中的位址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。對於大端模式,就將0x11放在低位址中,即0x0010中,0x22放在高位址中,即0x0011中。小端模式,剛好相反。我們常用的x86系統是小端模式。

記憶體中位址在這種表示法從左往右,由低位址到高位址。

(2)判斷大小端

可用共用體判斷:

int fun()

a; a.a = 1;

return (a.ch == 1)

}

令a = 1, 即為0x00000001。

然後只要判斷a.ch 是否為真,若是則為小端,不是則為大端,因為不管大端小端,存位址都是從首位開始存放。

(3)將整型資料按位逆序

主要想考的就是位運算的使用,就是怎麼把乙個整數的高低位的數值呼叫。

即:如果輸入1,即0001,應該輸出1000,即8。如果輸出257,即0010 0101 0111,應該輸出0100 1010 1110

#ifndef interview_big_little_h

#define interview_big_little_h

typedef unsigned short int uint16;

typedef unsigned long int uint32;

#define swp16(x) \

(((short)(x) & (short)0x00ff) << 8) | \

(((short)(x) & (short)0xff00) >> 8)

#define swap32(a) \

( (((uint32)(a) & (0xff000000)) >> 24) | \

(((uint32)(a) & (0x00ff0000)) >> 8) | \

(((uint32)(a) & (0x0000ff00)) << 8) | \

(((uint32)(a) & (0x000000ff)) << 24) )

#endif //interview_big_little_h

假設x=0xaabb

那(short)(x) & (short)0x00ff) ,就先將16位數高8位置0,成了0x00bb, 然後<<8 向左移8位後,低8位變成了高8位,低8位補0  結果為 0xbb00,後面一樣

(4)按位元組逆序

下面用巨集實現:

#define swap16(a) \

((((a) & 0xff) << 8) | (((a) >> 8) & 0xff))

#define swap32(a) \

(((a) >> 24) | (((a) & 0x00ff0000) >> 8) | \

(((a) & 0x0000ff00) << 8) | ((a) << 24))

#define swap64(a)

(((a) >> 56) | \

(((a) & 0x00ff000000000000) >> 40) | \

(((a) & 0x0000ff0000000000) >> 24) | \

(((a) & 0x000000ff00000000) >> 8) | \

(((a) & 0x00000000ff000000) << 8) | \

(((a) & 0x0000000000ff0000) << 24) | \

(((a) & 0x000000000000ff00) << 40) | \

(((a) << 56)))

vs2012以上提供ntohs、htons、ntohl、htonl這4個函式,已實現16位和32位本地位元組序的大小端轉換

mysql 大小端 CPU的大小端及如果判斷

不同體系結構的cpu,資料在記憶體中存放的排列順序是不一樣的。儲存器中對資料的儲存是以位元組 byte 為基本單位的,因此,字 word 和半字 half word 在儲存器中就有兩種次序,分別稱為 大端模式 big endian 和小端模式 little endian 大端儲存模式是指字或半字的最...

大小端的判斷

在計算機系統中,我們以位元組為儲存單位,每個位址的單元都是對應的乙個位元組,乙個位元組為8bit.在c語言中,不僅僅是乙個位元組來儲存資料,除了乙個位元組的char,還有兩個位元組的short,四個位元組的int,另外對於位數大於8位的處理器,例如32位處理器。由於暫存器的寬度大於乙個位元組的長度,...

大小端的判斷

1 什麼是大小端?大端 資料的低位儲存在記憶體的高位址中,而資料的高位儲存在記憶體的低位址處 小端 資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址處 2 為什麼要有大小端?為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,...