位元組序和大小端

2021-09-02 14:57:49 字數 1097 閱讀 6247

大多數處理器中記憶體是可以以位元組為單位進行定址的,當資料型別(int, long)大於1個位元組時,其所占用就的位元組在記憶體中的順序存在兩種模式,分別是小端模式(little endian)和大端模式(big endian)。小端模式低位位元組存放在低位址,大端模式高位位元組存放在低位址。

大端模式的處理器上各位元組如下圖所示:

圖中的lsb是指最低有效位(little significant bit),msb是指最高有效位(most significant bit)。

下面用乙個示例程式來展示位元組序在程式設計中的重要性。如果在小端模式的處理器上該執行程式會輸出正確的執行結果,在大端模式的處理器上將輸出錯誤的結果。

如上圖我是在linux系統裡面執行得到的結果(linux是小端模式)。

下面分析一下為什麼同乙個程式在不同位元組序的處理器上執行的結果為什麼會不一樣,下圖是說明了在小端模式下main()呼叫foo()時module_id變數中值得變化過程。注意,foo()函式的引數是以指標的形式傳遞的,所以在main()中module_id變數的起始位址如果是0x10000,那麼傳入到foo()函式後_p_module_id變數指向的位址也是0x10000。

從上圖中可以看到,小端模式下並不存在問題,這與示例程式是相吻合的。下面我們在展示一下在大端模式的處理器中執行的情形,從圖中了解為什麼會出現問題

從這個示例程式中我們可以看出,由於處理器兩種位元組序的存在,如果指標的傳遞型別不匹配,有可能導致執行的結果出錯,因此在軟體開發過程中指標應當嚴格按照所需型別進行傳遞。

大小端位元組序

1.大端和小端問題 大小端位元組序與硬體有關 intel x86 都是小端位元組序 總結 大端是 按照正常我們書寫的順序來儲存的 小端是 按照我們書寫順序相反的 實現 include int main putchar n printf x n a return 0 檢視輸出結果,判斷大小端位元組序 ...

位元組序 大小端

計算機的基本儲存單元是8位單位元組。多位元組資料,如4位元組的整型資料如何儲存的呢?是高位在記憶體高位元組?還是低位在記憶體高位元組?即位元組是按如何順序存放的?也就是所謂的位元組序,按照存放順序分為大端序 big endian 和小端序 little endian 記憶體位址訪問是由低位址到高位址...

大小端位元組序

計算機硬體有兩種儲存資料的方式 大端位元組序 big endian 和小端位元組序 little endian 比如十六進製制數0x0102,十六進製制每個數字佔4bit,四個數字16bit,也就是2byte,2個位元組儲存。0x0102高位位元組是0x01,低位位元組是0x02。l大端位元組序 高...