學過編程的人都應該知道大小端字節序的概念,但是很多時候,總是把他們弄混,這是整理出來的一份很簡單的方式理解字節序的文章,廢話不多說,這里直接入正題。
什么是字節序?
字節序,簡單來說,就是指的超過一個字節的數據類型在內存中存儲的順序
那么就很明顯了,像char這樣的類型,肯定不存在字節序的問題了。
字節序分為哪幾類?
大端字節序:
高位字節數據存放在低地址處,低位數據存放在高地址處;
小段字節序:
高位字節數據存放在高地址處,低位數據存放在低地址處;
網絡字節序:
TCP/IP協議傳輸數據時,字節序默認大端。
其實字節序只有大端字節序和小端字節序兩種,網絡字節序也是大端,這個以后會說到。關於大小端字節序的重點,上面已經標的很明顯了,一個是高低地址,一個是高低位字節,那下面就看看這兩個是什么意思?
重點來了
首先看什么是高地地址:
在內存中,棧是向下生長的,以char arr[4]為例,(因為char類型數據只有一個字節,不存在字節序的問題)依次輸出每個元素的地址,可以發現,arr[0]的地址最低,arr[3]的地址最高,如圖:
接下來看什么是高低位:
給一個十進制整數,123456,很明顯左邊的是高位,右邊的是低位。計算機也是這樣認為的。給一個16進制數,0x12345678,以字節為單位,從高位到低位依次是 0x12、0x34、0x56、0x78。
下來將高地地址和高低位對應。
一個整形占4個字節,給一個整形數據0x12345678,如果是大端存儲,存儲格式如下:
如果是小端存儲,存儲格式如下:
那如何判斷當前系統是大端還是小端呢?
最簡單地來說,我們可以用 1 為例,1在棧中存儲的大小端格式分別如下圖所示,
如果我們可以得到 1 在內存中存儲的第一個字節,那么我們就可以知道當前系統是大端存儲還是小端存儲了。
測試代碼如下: