關于大端、小端的了解
Persus & Xie
在計算機系統中,存儲是以位元組為機關的,每個位址單元都對應着一個位元組,一個位元組為8bit。但在C語言 中,除了8bit的char類型外,也有32bit的float型,64bit的double型(要看具體的編譯器),另外,對于位數(bit)大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個位元組,是以存在一個問題:如何安排多個位元組。故,存在兩種模式來解決這個問題:大端存儲模式和小端存儲模式。
低位與高位
在我們的書寫習慣中,通常自左向右書寫一個數字,比如31415926,其中
3
是是最高有效位,
6
為最低有效位。計算機記憶體中一個位元組的位數相當于二進制數的位數,相當于最最低有效位表示
1
,倒數第二個有效位表示 2 × 1 2 \times 1 2×1或2,倒數第三個有效位表示 2 × 2 × 1 2 \times 2 \times 1 2×2×1或者4;以此類推,如果一個用記憶體中的兩個位元組表示一個16位的數字,那麼其中一個位元組應該存放在最低的8位有效位,而另一個位元組将存放在最高的8位有效位,如下圖所示。存放最低的8位有效位的位元組被稱為最低有效位位元組或低位位元組,而存放最高的8位有效位的位元組被稱為最高有效位位元組或高位位元組。

一個16位的數占兩個位元組的存儲空間,即高位位元組和低位位元組(見上圖)。如果是在紙上書寫一個16位的數,你總是會把高位位元組寫在前面,而把低位位元組寫在後面。然而,當這個數被存儲到記憶體中時**,并沒有固定的存儲順序**。
如果用H和L分别表示高位位元組和低位位元組,那麼可以有兩種方式把這兩個位元組存儲到記憶體中,即H在前L在後或者L在前H在後。把M存儲在前的順序被稱為“正向(forward)”或“高位優先順序;把L存儲在前的順序被稱為“逆向”或“低位優先”順序。
大端和小端
大端(Big-Endian)的定義:
把一個數的低位位元組序的内容存放到高位址端,高位位元組序的内容存放在低位址端
小端(Little-Endian)的定義:
把一個數的高位位元組序的内容存放到高位址端,低位位元組序的内容存放在低位址端
我們用一個例子來區分大端和小端,我們有一個數字
0x12 34 56 78
,它在記憶體中的表示方式為:
-
大端模式:
低位址-------------->高位址
0x12 | 0x34 | 0x56 | 0x78
-
小端模式**
低位址端-------------->高位址端
0x78 | 0x56 | 0x34 | 0x12
另外一個例子,對于一個16bit寬的數字
0x1024
在大端模式和小端模式下CPU的存放方式,假設存儲位置起始為
x1001
,則其可以表示為:
記憶體位址 | 小端模式存放内容 | 大端模式存放内容 |
---|---|---|
0x1001 | 0x24 | 0x10 |
0x1002 | 0x10 | 0x24 |
對于一個32bit寬的數字
0x12345678
在大端模式和小端模式下CPU的存放方式,假設存儲位置起始為
x1001
,則其可以表示為:
記憶體位址 | 小端模式存放内容 | 大端模式存放内容 |
---|---|---|
0x1001 | 0x78 | 0x12 |
0x1002 | 0x56 | 0x34 |
0x1003 | 0x34 | 0x56 |
0x1004 | 0x12 | 0x78 |
總結
本文通過從介紹
低位
與
高位
到進一步解釋了關于大端和小端的相關理論。