端是什么?
“我們常說的大端小端模式是計算機中?字節順序(Endianness)?常見的兩種表現形式。(此外還有混合序 (Middle-Endian))
“endian”一詞來源于十八世紀愛爾蘭作家喬納森·斯威夫特(Jonathan Swift)的小說《格列佛游記》(Gulliver's Travels)。小說中,小人國為水煮蛋該從大的一端(Big-End)剝開還是小的一端(Little-End)剝開而爭論,爭論的雙方分別被稱為“大端派”和“小端派”。”
上文來自《深入理解計算機系統》。
大端小端指的是內存中字節存儲的順序,從高往低是大端,從低往高是小端。
是大端還是小端是由什么決定?
是由CPU決定的,內存因為CPU而決定大端、小端的展現形式。
怎么知道自己的CPU是大端序還是小端序?
int checkCPU(void) { union { int a; char b; }c; c.a = 1; return (c.b == 1); }
?
定義一個整型變量test
并初始化為1。使用指針類型轉換將整型變量test
的地址轉換為字符指針類型。通過訪問該字符指針的第一個元素(即最低位字節),判斷其值是否為1。如果第一個元素的值為1,則輸出"小端",表示計算機采用小端字節序;否則輸出"大端",表示計算機采用大端字節序。
#include <stdio.h>
int main()
{int test=1;if(((char *)&test)[0]){printf("小端");}else{printf("大端");}return 0;
}
知道了這個有什么用?
模塊通訊,網絡傳輸,這些都需要我們知道字節的發送順序。
網絡字節序:TCP/IP各層協議將字節序定義為Big-Endian,因此TCP/IP協議中使用的字節序通常稱之為網絡字節序.
高/低字節定義:在十進制中我們都說靠左邊的是高位,靠右邊的是低位,在其他進制也是如此。就拿 0x12345678來說,從高位到低位的字節依次是0x12、0x34、0x56和0x78.
有大端為什么要有小端?有小端為什么要有大端?
大端更符合人類閱讀習慣,小端更具性能優勢。個人更傾向小端。