大小端由來
在計算機記憶體中,通常是以位元組(Byte),也就是 8 個位(Bit)為基本存儲單元(也有以 16 位為基本存儲單元的)。
對于像C++中的char這樣的資料類型,占用一個位元組的大小,不會産生什麼問題。
但是當資料類型為int,在32bit的系統中,它需要占用4個位元組(32bit),這個時候就會産生這4個位元組在寄存器中的存放順序的問題。比如int maxHeight = 0x12345678,&maxHeight = 0x0042ffc4。具體的該怎麼存放呢?這個時候就需要了解計算機的大小端的原理了。
大小端原理
大端:(Big-Endian):就是把數值的高位位元組放在記憶體的低位位址上,把數值的低位位元組放在記憶體的高位位址上。
小端:(Little-Endian):就是把數值的高位位元組放在高位的位址上,低位位元組放在低位位址上。
大端法和小端法指的是位元組在記憶體中存儲時的排列規則,而不是資料中的位的排列規則。也有以位序排列的機器,但很少見。另外,再次明确一下,大端法或小端法是資料在存儲時的表現,而不是在寄存器中參與運算時的表現。
union test
{
int num;
char ch;
};
int main()
{
test s;
s.num = ;
if (s.ch == )
cout << "大端機" << endl;
else
cout << "小端機" << endl;
return ;
}

大小端優缺點
大端模式優點:
- 符号位在所表示的資料的記憶體的第一個位元組中,便于快速判斷資料的正負和大小
小端模式優點:
- 記憶體的低位址處存放低位元組,是以在強制轉換資料時不需要調整位元組的内容(注解:比如把int的4位元組強制轉換成short的2位元組時,就直接把int資料存儲的前兩個位元組給short就行,因為其前兩個位元組剛好就是最低的兩個位元組,符合轉換邏輯);
- CPU做數值運算時從記憶體中依順序依次從低位到高位取資料進行運算,直到最後重新整理最高位的符号位,這樣的運算方式會更高效
網絡通信中的大小端
網絡傳輸中采用的大端标記法,也就是說先傳比較高權值的數字, 就像 12一樣,先傳10,在傳2,就算丢了後面一個,損失也不是太大。
如果系統是小端存儲,就要通過轉換成大端的方式,成為網絡位元組序。
C/C++中有如下四個常用的轉換函數,這四個函數在小端系統中生效,大端系統由于和網絡位元組序相同,是以無需轉換。
- htons —— 把unsigned short類型從主機序轉成網絡位元組序
- ntohs —— 把unsigned short類型從網絡位元組序轉成主機序
- htonl —— 把unsigned long類型從主機序轉成網絡位元組序
- ntohl —— 把unsigned long類型從網絡位元組序轉成主機序
// 頭檔案
#if defined(_LINUX) || defined(_DARWIN)
#include <netinet/in.h>
#endif
#ifdef WIN32
#include <WINSOCK2.H>
#endif