大端模式(big-endian)與小端模式(little-endian)
阿新 • • 發佈:2019-01-01
大端模式與小端模式
- 大端模式是指資料的低位儲存在記憶體的高地址中,而資料的高位儲存在記憶體的低地址中.
- 小端模式是指資料的低位儲存在記憶體的低地址中,而資料的高位儲存在記憶體的高地址中。
大小端模式的由來
在計算機系統中,我們是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為8bit。
但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器)。
另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於一個位元組,那麼必然存在著一個如果將多個位元組安排的問題。
因此就導致了大端儲存模式和小端儲存模式。
例如:
一個16bit的short型x,在記憶體中的地址為0x0010,x的值為0x1122。那麼0x11為資料高位元組,0x22為資料低位元組。
- 對於大端模式,就將0x11放在記憶體低地址中,即0x0010中;0x22放在記憶體高地址中,即0x0011中。
- 小端模式,就將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++執行的結果得到的是小端模式