1. x86處理器採用小端方式存儲多位元組數據嗎
Intel 80x86系列微處理器採用「小端方式」存放多位元組數據,即在內存中低地址存放低位元組、高地址存放高位元組,就是所謂「低對低、高對高」原則。
2. 大端模式和小端模式
具體如下:
1、大端模式:
大端模式,是指數據的高位,保存在內存的低地址中,而數據的低位,保存在內存的高地址中,這樣的存儲模式類似於把數據當作字元串順序處理。
地址由小向大增加,而數據從高位往低位放;小端模式,是指數據的高位保存在內存的高地址中,而數據的低位保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。
在大端模式下,前16位應該這樣讀: e6 84 6c 4e ( 假設int佔4個位元組)。
記憶方法: 地址的增長順序與值的增長順序相反。
2、小端模式例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000。
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000。
在小端模式下,前16位應該這樣讀: 4e 6c 84 e6( 假設int佔4個位元組)。
記憶方法: 地址的增長順序與值的增長順序相同。
大小端模式:
為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為 8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於 8位的處理器。
例如16位或者32位的處理器,由於寄存器寬度大於一個位元組,那麼必然存在著一個如何將多個位元組安排的問題。因此就導致了大端存儲模式和小端存儲模式。例如一個16bit的short型x,在內存中的地址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。
對於 大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反。我們常用的X86結構是小端模式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬體來選擇是大端模式還是小端模式。
3. Big Endian與Little Endian位元組存儲順序
不同的CPU有不同的位元組序類型,這些位元組序是指整數在內存中保存的順序。分為小端格式和大端格式(Little-Endian&Big-Endian):
比如0x1234; 低8位是34,高8位是12;如果它們分配的內存其實地址是0x0001,
那麼如果是大端存儲,那麼0x0001內存低位地址存放高位位元組12;如果是小端存儲,那麼0x0001內存低位地址存放低位位元組34,0x0002存放12。
據Jargon File記載,endian這個詞來源於Jonathan Swift在1726年寫的諷刺小說 "Gulliver's Travels"(《格利佛游記》)。該小說在描述Gulliver暢游小人國時碰到了如下的一個場景。在小人國里的小人因為非常小(身高6英寸)所以總是碰到一些意想不到的問題。有一次因為對水煮蛋該從大的一端(Big-End)剝開還是小的一端(Little-End)剝開的爭論而引發了一場戰爭,並形成了兩支截然對立的隊伍:支持從大的一端剝開的人Swift就稱作Big-Endians,而支持從小的一端剝開的人就稱作Little-Endians......(後綴ian表明的就是支持某種觀點的人)。
1980年,Danny Cohen在其著名的論文"On Holy Wars and a Plea for Peace"中為了平息一場關於在消息中位元組該以什麼樣的順序進行傳送的爭論而引用了該詞。該文中,Cohen非常形象貼切地把支持從一個消息序列的最高位開始傳送的那伙人叫做Big-Endians,支持從最低位開始傳送的相對應地叫做Little-Endians。此後Endian這個詞便隨著這篇論文而被廣為採用。
little endian和big endian是表示計算機位元組順序的兩種格式,所謂的位元組順序指的是長度跨越多個位元組的數據的存放形式.
假設從地址0x00000000開始的一個字中保存有數據0x1234abcd,那麼在兩種不同的內存順序的機器上從位元組的角度去看的話分別表示為:
需要特別說明的是,以上假設機器是每個內存單元以8位即一個位元組為單位的. 簡單的說,little endian把低位元組存放在內存的低位;而big endian將低位元組存放在內存的高位.
現在主流的CPU,intel系列的是採用的little endian的格式存放數據,而motorola系列的CPU採用的是big endian.
比如: int x, 它的地址為0x100。 那麼它占據了內存中的Ox100, 0x101, 0x102, 0x103這四個位元組(32位系統,所以int佔用4個位元組)。
上面只是內存位元組組織的一種情況: 多位元組對象在內存中的組織有一般有兩種約定。 考慮一個W位的整數。它的各位表達如下:
Xw-1, Xw-2, ... , X1, X0,它的
MSB (Most Significant Byte, 最高有效位元組)為 Xw-1, Xw-2, ... Xw-8;
LSB (Least Significant Byte, 最低有效位元組)為 X7,X6,..., X0。
其餘的位元組位於MSB, LSB之間。
這就引出了大端(Big Endian)與小端(Little Endian)的問題。如果LSB在MSB前面, 既LSB是低地址, 則該機器是小端; 反之則是大端。
對於數據中跨越多個位元組的對象, 我們必須為它建立這樣的約定:
對於跨越多個位元組的對象,一般它所佔的位元組都是連續的,它的地址等於它所佔位元組最低地址。(鏈表可能是個例外, 但鏈表的地址可看作鏈表頭的地址)。
import java.nio.ByteOrder;
4. 大小端存儲二進制與位元組的轉換
位:「位(bit)」是電子計算機中最小的數據單位。每一位的狀態只能是0或1。
位元組:8個二進制位構成1個「位元組(Byte)」,它是存儲空間的基本計量單位。1個位元組可以儲存1個英文字母或者半個漢字,換句話說,1個漢字占據2個位元組的存儲空間。
字:「字」由若干個位元組構成,字的位數叫做字長,不同檔次的機器有不同的字長。例如一台8位機,它的1個字就等於1個位元組,字長為8位。如果是一台16位機,那麼,它的1個字就由2個位元組構成,字長為16位。字是計算機進行數據處理和運算的單位。
KB:在一般的計量單位中,通常K表示1000。
8bit(位)=1Byte(位元組)
1024Byte(位元組)=1KB
1024KB=1MB
1024MB=1GB
換算率約等於1000(1024),從大到小順序為T、GB、MB(兆Zhao)、KB、B再小就是位了
下面以unsigned int value = 0x12345678為例,分別看看在兩種位元組序下其存儲情況,我們可以用unsigned char buf[4]來表示value
Big-Endian: 低地址存放高位,如下:
Little-Endian: 低地址存放低位,如下:
這里以 16進制 0x35 為例,進行二進制字元串轉換:(0x35 的二進制為 0011 0101)
以下轉換例子都是以「小端存儲」方式編碼的
short 佔2byte
5. 大端存儲與小端存儲對存儲數據的要求
大端小端針對多位元組數據存儲時位元組順序而言的。所謂"Little Endian",為INTEL所採用模式,數據的低位元組存放在內存低地址中,高位元組存放在高地址中,即學X86時說的「高高低低」原則。Byte3 Byte2 Byte1 Byte0在內存中對應的是:
Base Address+0 Byte0
Base Address+1 Byte1
Base Address+2 Byte2
Base Address+3 Byte3
所謂"Big Endian" ,為MOTO所採用模式,數據的低位元組存放在內存的高地址,數據的高位元組存放在內存的低地址。Byte3 Byte2 Byte1 Byte0在內存中對應的是:
Base Address+0 Byte3
Base Address+1 Byte2
Base Address+2 Byte1
Base Address+3 Byte0
Java使用的是大端序來存儲數據。big—endian:即低位元組的數據存儲在高位內存上,如對於1234,12是高位數據,34為低位數據,則java中的存儲格式應該為12存在內存的低地址,34存在內存的高地址,x86中的存儲格式與之相反。
6. 有一個 32 位字 0x34556789, 存放的起始地址為 0x00040000,在小端格式下如何
32 位字數據的高位元組存儲在高地址,而字數據的低位元組存放在低地址中,0x00040000—0x00040003 分別存放 0x78,0x56,0x34,0x12
大端模式,是指數據的高位元組保存在內存的低地址中,而數據的低位元組保存在內存的高地址中,這樣的存儲模式有點兒類似於把數據當作字元串順序處理:地址由小向大增加,數據從高位往低位放;這和我們的閱讀習慣一致。小端模式,是指數據的高位元組保存在內存的高地址中,而數據的低位元組保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低。
7. 計算機內存採用位元組存儲模式
計算機系統中內存是以位元組為單位進行編址的,每個地址單元都唯一的對應著1個位元組(8 bit)。
這可以應對char類型數據的存儲要求,因為char類型長度剛好是1個位元組,但是有些類型的長度是超過1個位元組的(字元串雖然是多位元組的,但它本質是由一個個char類型組成的類似數組的結構而已),比如C/C++中,short類型一般是2個位元組,int類型一般4個位元組等。
因此這里就存在著一個如何安排多個位元組數據中各位元組存放順序的問題。正是因為不同的安排順序導致了大端存儲模式和小端存儲模式的存在。
8. 標題 32位無符號二進制的數據怎麼存儲
對於常見的小端模式存儲來說,32位二進制數被從高到低分成每8位一個位元組方式共4位元組存儲,順序存放,先存最低位位元組,最後存最高位元組
比如:12345678H
小端存儲:78H,56H,34H,12H
大端存儲:12H,34H,56H,78H
象PC機Windows系統、Linux這樣的系統都是小端模式存儲。
大端存儲舉例:網路數據包中的數值。
9. 位元組數組何為大端模式和小端模式
大端模式和小端模式一般是指多位元組數據的存儲方式
當多位元組數據存儲時,如果以位元組數組的方式來查看時,會發現兩種模式有不同的存儲方式
舉例:短整型數0x1234,存放在內存中,地址是8000H
大端模式: 數據高位位元組先存
8000H:0x12
8001H:0x34
小端模式: 先存放數據的低位位元組
8000H:0x34
8001H:0x12
10. 什麼是存儲多位元組數據的小端方式
例如數字 0x2345 在內存中存儲的時候低地址存45,高地址存23。
詳細敘述如下:
Big-Endian和Little-Endian的定義如下:
1) Little-Endian就是低位位元組排放在內存的低地址端,高位位元組排放在內存的高地址端。
2) Big-Endian就是高位位元組排放在內存的低地址端,低位位元組排放在內存的高地址端。
舉一個例子,比如數字0x12 34 56 78在內存中的表示形式為:
1)大端模式:
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12