C語言,大小端字節(jié)序
什么是大小端?
首先,我們要知道如何區(qū)分數(shù)據(jù)的高位與低位:
如數(shù)字123,分別對應(yīng)‘個?十 百’,個位3為低位,百位1為高位。
大小端模式,又稱大小端字節(jié)序存儲模式。
大端字節(jié)序存儲模式,是指數(shù)據(jù)的低位保存在內(nèi)存的高地址中,而數(shù)據(jù)的高位保存在內(nèi)存的低地址中。
小端字節(jié)序存儲模式,是指數(shù)據(jù)的低位保存在內(nèi)存的低地址中,而數(shù)據(jù)的高位保存在內(nèi)存的高地址中。
如圖p0:

在Windows端,如VStudio編譯器,數(shù)據(jù)是以小端字節(jié)序存儲模式在內(nèi)存中存儲的。

如圖片p1,雖然最終的數(shù)據(jù)為0x 00 00 00 01,但在調(diào)試查看時顯示出來的是0x 01 00 00 00,這就是小端字節(jié)序存儲模式。
注:數(shù)據(jù)在內(nèi)存中是以二進制的形式存儲的,目前我們所見的16進制數(shù)據(jù)是為了迎合VS編譯器所顯示的小端字節(jié)序存儲模式,方便查看及理解。

為什么會有大小端模式?
標準答案:這是因為在計算機系統(tǒng)中,我們是以字節(jié)為單位的,每個地址單元都對應(yīng)著一個字節(jié),一個字節(jié)為8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對于位數(shù)大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個字節(jié),那么必然存在著一個如何將多個字節(jié)安排的問題。因此就導致了大端存儲模式和小端存儲模式。
一開始是由于不同架構(gòu)的CPU處理多個字節(jié)數(shù)據(jù)的順序不一樣,比如x86的是小段模式,KEIL C51是大端模式。但是后來互聯(lián)網(wǎng)流行,TCP/IP協(xié)議規(guī)定為大端模式,為了跨平臺通信,還專門出了網(wǎng)絡(luò)字節(jié)序和主機字節(jié)序之間的轉(zhuǎn)換接口(ntohs、htons、ntohl、htonl)
?大小端模式各有優(yōu)勢:小端模式強制轉(zhuǎn)換類型時不需要調(diào)整字節(jié)內(nèi)容,直接截取低字節(jié)即可;大端模式由于符號位為第一個字節(jié),很方便判斷正負。
大小端判斷方法: