2018年3月29日 星期四

研究 | 大端 (Big Endian) 與 小端 (Little Endian) 的差異

什麼是記憶體

從軟體的角度,記憶體可以想像成一塊連續的儲存空間,最小的儲存單位是位元組(Byte)。
雖然可以操縱位元(bit),但還是以位元組(Byte)為最小單位做儲存。

例如:

用雞蛋盒對照記憶體,雞蛋盒就是儲存空間,一個雞蛋就是最小的儲存單位。

如何指定存取哪些記憶體位元組

記憶體可以儲存相當多的位元組(Byte),為了指定要存取哪一個,每一個位元組(Byte)都有一個號碼做代表,就是記憶體位址(Memory Address),因為是連續的儲存空間,所以記憶體位址(Memory Address)也是連續的。

例如:

以 4GB 記憶體來說 (GB 的 G 是 2 的 30 次方,而 B 是 Byte)
可以儲存 2 的 32 次方個位元組(Bytes) = 4,294,967,296 個位元組(Byte)
記憶體位址從 0 開始,所以範圍就是從 0 到 4,294,967,295

一次可以存取多少位元組

雖然記憶體位址是以位元組(Byte)來編號,但存取時可以"一次"存取(從硬體角度)多個位元組(Byte)。

例如:

以 C 語言來說(假設編譯成64位元程式)
"一次"可以存取如下 (運行在64位元CPU,記憶體寬度為64位元)

char  = 1個位元組(1-Byte) = 8位元(8-bit)
short = 2個位元組(2-Byte) = 16位元(16-bit)
int   = 4個位元組(4-Byte) = 32位元(32-bit)
long  = 8個位元組(8-Byte) = 64位元(64-bit)

資料如何寫入記憶體?資料從記憶體被讀取到哪裡

不考慮 DMA 與 cache,當程式要做運算時,其實是 CPU 讀取記憶體的資料後放到 CPU 的暫存器(register)做運算,而運算結果也是從 CPU 的暫存器(register)寫回到記憶體。因此提到存取記憶體,就要想到暫存器(register)。

什麼是位元組順序 Endianness什麼是 Big endian什麼是 Little endian

指的是多位元組(Multibyte)資料儲存在記憶體的順序

因為"一次"對記憶體寫入或讀取一個位元組(Byte)沒有順序問題

但是"一次"對記憶體寫入或讀取多個位元組(Multibyte)會有順序問題

而 Big endian 與 Little endian 就是兩種不同的儲存順序

底下圖片說明,從記憶體寫入或讀取4-Byte時,Big endian 與 Little endian 的差異

說明:
1. 圖中 Memory 下的 A, A+1, A+2, A+3 指的是記憶體位址,A 是低記憶體位址,  
   A+3是高記憶體位址。
2. 圖中 Register 上的 24, 16, 8, 0 指的是第幾位元(bit),0 是 LSB。






沒有留言:

張貼留言