天天看點

作業系統的大端小端

1. 什麼是大端,什麼是小端:

所謂的大端模式,是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中;

所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中。(大部分的作業系統都是小端,而通訊協定是大端)

2.為什麼會有大小端:

為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為機關的,每個位址單元都對應着一個位元組,一個位元組為8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對于位數大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個位元組,那麼必然存在着一個如果将多個位元組安排的問題。是以就導緻了大端存儲模式和小端存儲模式。例如一個16bit的short型x,在記憶體中的位址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。對于大端模式,就将0x11放在低位址中,即0x0010中,0x22放在高位址中,即0x0011中。小端模式,剛好相反。我們常用的X86結構是小端模式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬體來選擇是大端模式還是小端模式。

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

16bit寬的數0x1234在Little-endian模式(以及Big-endian模式)CPU記憶體中的存放方式(假設從位址0x4000開始存放)為:

記憶體位址 小端模式存放内容 大端模式存放内容
0x4000 0x34 0x12
0x4001

32bit寬的數0x12345678在Little-endian模式以及Big-endian模式)CPU記憶體中的存放方式(假設從位址0x4000開始存放)為:

0x78
0x56
0x4002
0x4003

可以看出來小端模式,讀取記憶體就可以得到相應數字,無需調整結構,而大端需要調整結構,但是大端可以最先讀到正負符号,快速得知該數字是正數還是負數。

驗證一下~:

#include <iostream>
using namespace std;

void IsBigEndian()
{
        int a = 0x1234;
        char b =  *(char *)&a;  //通過将int強制類型轉換成char單位元組,通過判斷起始存儲位置。即等于 取b等于a的低位址部分
        if( b == 0x12)
        {
           cout<<"big endian"<<endl;
           return;
        }
        cout<<"small endian"<<endl;
        return;
}

int main()
{
 IsBigEndian();
}      
作業系統的大端小端