資料的儲存(1) 位元組序與位元序

2021-10-07 07:04:11 字數 1712 閱讀 5227

在計算機的發展過程中,由於不同硬體體系在資料高低有效位及儲存方式理解上的差異,出現了大端和小端這兩種截然相反的對資料的位進行解釋的模式。大小端模式本身沒有優劣之分,但我們在開發過程中,需要時刻考慮裝置大小端差異可能會對程式帶來的影響,其中最典型的就是位元組序和位元序問題。

大多數計算機使用位元組作為最小的可定址的記憶體單元。對於多位元組的資料,一般都會被儲存為連續的位元組序列,但是組成資料的位元組在記憶體中的存放順序不同,對於不同的硬體體系也會有不同的解釋。通常位元組序規則分為兩種:

以乙個簡單的整型數0x12345678為例,可以檢視其在使用小端法和大端法儲存時的差異:

一般來說,機器的位元組序對於上層應用完全是不可見的,程式編譯時已經幫我們進行了處理,但是在一些特殊的場景中,典型的如在不同型別的機器之間傳輸資料時,就必須要考慮位元組序差異的問題。

對於特定的硬體體系結構,使用的位元組順序基本都是確定的,linux下可以使用lscpu命令進行檢視。更通用的,我們可以自己編寫程式使用union聯合體來進行確認:

#include #include int main(void)

endian = ;

endian.i_val = 1;

printf("c_val is %d.\n", endian.c_val);

return 0;

}

上述程式中,c_val的值始終儲存於最低記憶體位址中。執行上述程式,如果c_val顯示的結果為1,則說明當前機器是小端模式;若c_val顯示的結果為0,則說明當前機器是大端模式。

位元組序關注的是多位元組資料的不同位元組在記憶體中排列順序,而位元序關注的是單個位元組內bit的排列順序。對於某個確定的計算機系統,位元序通常與位元組序保持一致,即:

考慮乙個最簡單的單位元組的資料0x34,在不同機器上的儲存:

從圖中可以看到,小端系統預設從記憶體的低位元位開始儲存資料,而大端系統則從記憶體的高位元位開始儲存。在大部分情況下,計算機系統已經隱式幫我們做了轉換處理,只有在一些極特殊的場景下,比如使用位域,我們需要考慮位元序差異可能帶來的影響。

實際上,大端機器和小端機器區別的本質是由於處理器的資料引腳和系統位址匯流排的連線方向的不同,這導致了不同的機器會按照不同的方法來解釋高低位元組以及單個位元組內的高低位順序。在此我們以32位整型數0x12345678為例,檢視多位元組的資料在大端和小端機器上記憶體布局的差異:

我們可以看到記憶體中位的排列順序後,大端和小端系統上,除了明顯的位元組排列上的差異,對於資料特定的某個位元組在記憶體中的位元序列是完全相反的。在日常的數字書寫規則中,我們一般都是從左到右進行書寫,並且都是先寫數字的高位再寫低位,從這點上看,大端系統的表示更符合我們平常的書寫習慣;而小端系統上,由於實際資料的高低有效位與記憶體bit的高低位是一致的,對於我們日常進行資料運算來說要更容易理解一些。

在考慮位元組序和位元序問題時,有乙個簡單的規則:在對資料進行整存整取時,此時不需要考慮序列的差異,系統缺省會幫我們處理一切;但是在對資料進行零存整取或者整存零取時,就必須關注大小端可能會帶來的差異。

大小端 位元組序與位元序

前兩天被問到乙個關於大小端的問題,很久沒接觸,回答的支支吾吾,說到底還是自己對這個了解的不徹底,今天補上。這裡明確下,大小端包括位元組序和位元序。他們的概念其實也是類似的,區別就如同他們名字,最小排序單位分別是位元組與位元。如果不是做晶元或者網路 通訊協議,搞計算機的一般都不涉及也不關心位元序。關於...

大端序與小端序 位元組序與位域的儲存

談到位元組序的問題,必然牽涉到兩大cpu派系 motorola的powerpc系列cpu和intel的x86系列cpu。powerpc系列採用big endian 大端序 大字節序 高位元組序 方式儲存資料,而x86系列則採用little endian 小端序 小字節序 低位元組序 方式儲存資料。何...

資料在計算機中的儲存(位元組序,浮點數)

1 大端模式 低位址 高位址 0x12 0x34 0x56 0x78 2 小端模式 低位址 高位址 0x78 0x56 0x34 0x12 3 常見大小端模式 一般作業系統都是小端,而通訊協議是大端的。big endian powerpc ibm sun little endian x86 dec ...