在幾乎所有的機器上,多位元組物件都被儲存為連續的位元組序列,物件的位址為所使用位元組中的最小位址。
例如,假設乙個型別為int的變數x的位址為0x100,即&x的值為0x100。那麼x的4個位元組將被儲存在位元組序即為多位元組物件儲存在記憶體中的位元組順序,有兩種不同的儲存方案:大端法和小端法。現代的處理器大多為雙端法,大小端都支援,可以配置稱大端法或者小端法。儲存器的0x100,0x101,0x102和0x103的位置。
最高有效位元組在最前面的方式稱為大端法,例如假設變數x型別為int型,位於位址0x100的地方,其16進製制值為0x12345678,位址範圍為0x100到0x103位元組。
對於大端法的機器來說:
0x100
0x101
0x102
0x103
1234
5678
由上圖可見,位址從左向右增長,x的最高有效位元組12在最前面儲存。這正好和我們平時書寫習慣一致,先書寫最高有效位元組,再依次寫其餘位元組。
最低有效位元組在最前面的方式成為小端法,這正好和大端法相反,仍然用大端法中舉的例子說明:
0x100
0x101
0x102
0x103
7856
3412
由上圖可見,位址依然從左向右增長,x的最低有效位元組在最前面儲存,與大端法相反。
在《unix網路程式設計》上有乙個程式可以判斷乙個機器是大端法還是小端法,我稍加改造了一下:
#include#includeint
main(int argc, char **argv)
un;un.s = 0x0102;
if (sizeof(short) == 2) else
printf("sizeof(short) = %d\n", sizeof(short));
exit(0);
}
多數程式設計師不必關係所使用的機器是大端法還是小端法,在大多數情況下都不會出問題,但在某些特殊情況下這有可能成為問題:
1.編寫網路程式時,主機之間通過網路相互通訊,不同主機之間可能採用不同的方法,而且網路位元組序和主機位元組序也可能不同。
當小端法機器產生的資料被傳送到大端法機器或者反方向傳送時會發現接受程式子裡面的位元組成了反序的。為了避免這種情況的發
生,規定網路應用程式在將資料傳送之前現將資料轉換稱網路位元組序,在接收主機那邊,主機再將網路位元組序的資料轉換成適合本
主機的主機位元組序,從而避免了位元組序異常。(網路位元組序為大端法)
網路程式設計中常用的轉換函式有如下幾個:
uing16_t htons(uint16_t host16bitvalue); // 引數為16位主機位元組序的值,返回值是16位網路位元組序的值
uint32_t htonl(uint32_t host32bitvalue); // 引數為32位主機位元組序的值,返回值是32位網路位元組序的值
uint16_t ntohs(uint16_t net16bitvalue); // 引數為16位網路位元組序的值,返回值是16位主機位元組序的值
uint32_t ntohl(uint32_t net32bitvalue); // 引數為16位網路位元組序的值,返回值是16位主機位元組序的值
2.當除錯程式時常常需要將程式編譯成彙編形式,當閱讀彙編**時資料的位元組序很重要,需要根據自己的機器是大端法還是小
端法來不同對待,以免搞錯位元組順序。
3.當編寫規避正常型別系統的程式時,在c語言中可以使用強制型別轉換來允許以一中型別引用乙個物件,而這種資料型別與建立
這個物件時定義的資料型別不同,大多數應用程式設計都不推薦這種編碼技巧,但是它們對於系統級程式設計來說十分有用。
大端法,小端法位元組序
關於位元組序 大端法 小端法 的定義 也可以說 1.小端法 little endian 就是低位位元組排放在記憶體的低位址端即該值的起始位址,高位位元組排放在記憶體的高位址端。2.大端法 big endian 就是高位位元組排放在記憶體的低位址端即該值的起始位址,低位位元組排放在記憶體的高位址端。舉...
位元組序問題 大端法小端法
位元組序問題 大端法小端法 一 位元組序定義 位元組序,顧名思義位元組的順序,再多說兩句就是大於乙個位元組型別的資料在記憶體中的存放順序 乙個位元組的資料當然就無需談順序的問題了 其實大部分人在實際的開發中都很少會直接和位元組序打交道。唯有在跨平台以及網路程式中位元組序才是乙個應該被考慮的問題。在所...
大端法 小端法 網路位元組序
unxi網路程式設計 定義 術語 小端 和 大端 表示多位元組值的哪一端 小端或大端 儲存在該值的起始位址。小端存在起始位址,即是小端位元組序 大端存在起始位址,即是大端位元組序。也可以說 1.小端法 little endian 就是低位位元組排放在記憶體的低位址端即該值的起始位址,高位位元組排放在...