基礎 大小端位元組序

2021-09-24 21:45:35 字數 1345 閱讀 3767

在幾乎所有機器上,多位元組物件都被儲存為連續的位元組序列,物件的位址為所使用位元組中最小的位址。例如,假設乙個型別為int的變數x位址為0x100,也就是說位址表示式&x的值為0x100。那麼,x的4個位元組將被儲存在儲存器的0x100、0x101、0x102和0x103的位置。

那麼,如果這個變數的值為0x01234567的話,是0x01被儲存在0x100,還是0x67被儲存在0x100呢?這就所謂的大小端位元組序的問題。

假如機器選擇在儲存器中按照從最低有效位元組到最高有效位元組的順序儲存物件,則稱為小端位元組序(little endian)。即將0x01234567中低位的值0x67儲存在位址低位的0x100上,儲存值位的增長方向與位址的增長方向是一致的,如下所示,這比較符合我們邏輯直覺。

假如機器選擇在儲存器中按照從最高有效位址到最低有效位址的順序儲存物件,則稱為大端位元組序(big endian)。即將0x01234567中高位的值0x01儲存在位址低位的0x100上,儲存值位的增長方向與位址的增長方向是相反的,如下所示,這比較符合我們的視覺直覺。

兩種位元組序都是差不多的,並沒有哪種比較好。但是從我個人的看法,結合以前用過可擴充套件點陣圖來記錄一些東西的經歷,我更偏向於小端位元組序,在使用中也會更好。例如用char陣列來記錄幾千個id中第x個id被用了,那就是先x/8來得到對應要設定的位在陣列中的索引,顯然x越小,索引值越小,也就是越靠近陣列開始的地方,這不就是與小端位元組序是一樣的嘛。而且這樣子也很容易拓展,畢竟位址正常的生長方向都是從小到大往右生長的。

由於位元組序是由主機決定的,所以同一主機內的對於同一段資料解釋是不會出現問題的。但是如果涉及到網路通訊,這個時候兩端的兩台主機可能一台是小端位元組序而另一台是大端位元組序,那就會導致通訊出現問題,因為解析方式已經是錯的了。所以就需要對網路通訊中的位元組序進行約定,即網路位元組序。網路位元組序採用的是大端位元組序。所有主機在通過網路傳送內容時,會先將內容轉換位網路位元組序再傳送出去,而接受到內容時則會先將其轉換為本地的位元組序再處理。

那我們怎麼可以知道本地主機是大端位元組序還是小端位元組序呢?方法很簡單,將0x01234567儲存到int變數x中,在將其轉換位char陣列,如果陣列第乙個值是0x01,那就是大端的,而如果是0x67,則說明是小端的了。

#include #include int main()

大小端位元組序

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大端位元組序 高...