天天看點

關于大端、小端的了解關于大端、小端的了解

關于大端、小端的了解

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

總結

本文通過從介紹

低位

高位

到進一步解釋了關于大端和小端的相關理論。

繼續閱讀