1. 程式人生 > >大端模式(big-endian)與小端模式(little-endian)

大端模式(big-endian)與小端模式(little-endian)

參考自

大端模式與小端模式

  1. 大端模式是指資料的低位儲存在記憶體的高地址中,而資料的高位儲存在記憶體的低地址中.
  2. 小端模式是指資料的低位儲存在記憶體的低地址中,而資料的高位儲存在記憶體的高地址中

大小端模式的由來

在計算機系統中,我們是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為8bit

但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器)。

另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於一個位元組,那麼必然存在著一個如果將多個位元組安排的問題。

因此就導致了大端儲存模式和小端儲存模式。

例如:
一個16bit的short型x,在記憶體中的地址為0x0010,x的值為0x1122。那麼0x11為資料高位元組,0x22為資料低位元組。

  1. 對於大端模式,就將0x11放在記憶體低地址中,即0x0010中;0x22放在記憶體高地址中,即0x0011中。
  2. 小端模式,就將0x11放在記憶體高地址中,即0x0011中;0x22放在記憶體低地址中,即0x0010中。

我們常用的X86結構是小端模式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬體來選擇是大端模式還是小端模式。

大小端在記憶體中的存放方式舉例

例如:

a) 16bit寬的數0x1234
1.Little-endian模式CPU記憶體中的存放方式(假設從地址0x4000開始存放)為:

記憶體地址
0x4000
0x4001
存放內容
0x34
0x12

2.Big-endian模式CPU記憶體中的存放方式則為:

記憶體地址
0x4000
0x4001
存放內容
0x12
0x34

b) 32bit寬的數0x12345678
1.Little-endian模式CPU記憶體中的存放方式(假設從地址0x4000開始存放)為:

記憶體地址
0x4000
0x4001
0x4002
0x4003
存放內容
0x78
0x56
0x34
0x12

2.Big-endian模式CPU記憶體中的存放方式則為:

記憶體地址
0x4000
0x4001
0x4002
0x4003
存放內容
0x12
0x34
0x56
0x78

如何測試編譯器是大端還是小端

下面這段程式碼可以用來測試一下你的編譯器

是大端模式還是小端模式:

#include<stdio.h>

int main()
{
    short int x; //2 bytes
    char x0,x1;
    x=0x1122;
    x0=((char *)&x)[0];  //記憶體低地址單元
    x1=((char *)&x)[1];  //記憶體高地址單元
    printf("x0=0x%x,x1=0x%x",x0,x1);// 若x0=0x11,則是大端; 若x0=0x22,則是小端......
    return 0;
}
用DEV-C++執行的結果得到的是小端模式