大端模式:是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;這和我們的閱讀習慣一致。
小端模式:是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低。
(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 為什麼要有大小端?為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,...