大端機與小端機介紹及其判斷(C)

2021-10-11 09:17:12 字數 1207 閱讀 9911

這是因為在計算機中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為 8 bit。但是在c 語言中除了 8 bit 的char之外,還有 16 bit 的 short型,32bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。例如乙個16bit的short型 x ,在記憶體中的位址為 0x0010,x 的值為0x1122,那麼0x11位高位元組,0x22位低位元組。對於大端模式,就將0x11放在低位址中,即0x0010中,0x22放在高位址中,即0x0011中。小端模式,剛好相反。我們常用的x86結構是小端模式,而keil c51則為大端模式。很多的arm,dsp都為小端模式。有些arm處理器還可以由硬體來選擇是大端模式還是小端模式。

電腦讀取記憶體資料時,是從低位位址到高位位址進行讀取。

舉例:乙個整型是4個位元組,如:0x1a2b3c4d。(16進製制資料)

可以看出大端儲存資料和我們在c中用字元陣列儲存字串是一樣的,順序一致,這樣的好處是可以快速判別正負。小端機則便於轉換資料。

假設目前有資料 a 為 int 型別,值為1,則表示為 0x1,如下圖所示,表示了大小端存放資料的順序差別。

如果我們要檢測機器是大端還是小端,由於機器是從低位址到高位址讀取資料(即上圖中從左到右),所以可以將int型別的數值 1 賦值給 char 型資料。如上圖所示,賦值給char型資料,由於char讀取乙個位元組,所以如果是小端機,則char型別資料等於1,大端機為0。判斷**如下:

int check_sys()

un; un.a = 1;

if(un.b == 1)

return 1;//小端

else

return 0;//大端

}

一開始一直糾結大端機資料讀取方法會不會造成大小端機對於同乙個數值最後讀取值不一樣,機器是從低位址到高位址讀取資料的。後來也釋懷了,無論大小端機讀取資料的時候,肯定是全部讀取完後再判斷數值,比如此處讀取乙個int型資料,不可能讀一半讀兩個位元組就判斷數值大小。全部讀進去之後肯定有相應的機制去解讀,讀取順序不會影響最終數值的。

參考:

大端機和小端機

big endian 和 little endian 位元組排序 位元組排序 含義 big endian 乙個word中的高位的byte放在記憶體中這個word區域的低位址處。little endian 乙個word中的低位的byte放在記憶體中這個word區域的低位址處。必須注意的是 表中乙個wo...

大端機和小端機

在幾乎所有的機器上,多位元組物件都被儲存為連續的位元組序列,對表示乙個物件的位元組序列有兩種方法 大端法和小端法。主要區別在於存放的位元組順序,高序位元組存放在低位址成為大端,低序位元組存放在低位址成為小端。在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為 8bi...

大端小端區別與判斷

所謂的大端模式,是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中。為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組...