天天看點

大小端判斷和網絡位元組序大小端由來大小端原理

大小端由來

在計算機記憶體中,通常是以位元組(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 ;
}
           
大小端判斷和網絡位元組序大小端由來大小端原理

大小端優缺點

大端模式優點:

  • 符号位在所表示的資料的記憶體的第一個位元組中,便于快速判斷資料的正負和大小

小端模式優點:

  1. 記憶體的低位址處存放低位元組,是以在強制轉換資料時不需要調整位元組的内容(注解:比如把int的4位元組強制轉換成short的2位元組時,就直接把int資料存儲的前兩個位元組給short就行,因為其前兩個位元組剛好就是最低的兩個位元組,符合轉換邏輯);
  2. 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
           

繼續閱讀