引言
在計算機內存中,通常是以字節(Byte),也就是 8 個位(Bit)為基本存儲單元(也有以 16 位為基本存儲單元的)。對於跨越多個字節的數據類型(比如 int 長 4 個字節),如何在內存中對這些字節進行排序有兩種常見的方法:大端法(Big-endian)和小端法(Little-endian)
【注】首先不管是大端法還是小端法存儲,計算機在內存中存放數據的順序都是從低地址到高地址,所不同的是首先取低字節的數據存放在低地址還是取高字節數據存放在低地址。
基本概念
高位放在低地址就是大端法
低位放在低地址就是小端法
例如0x0A0B0C0D的在大端和小端中的存放方式分別為:
程序驗證
清單一:利用C里的聯合類型
1 #include<stdio.h> 2 3 union MyUnion 4 { 5 int a; 6 char c; 7 }; 8 9 int main() 10 { 11 MyUnion mu; 12 mu.a = 0x0001; 13 if (mu.c == 1) printf("small endian\n"); 14 else printf("big endian\n"); 15 16 17 return 0; 18 }
清單二:利用指針
1 #include<stdio.h> 2 3 typedef unsigned char *byte_pointer; 4 5 void show_bytes(byte_pointer start, size_t len) 6 { 7 size_t i; 8 for (int i = 0; i < len; i++) 9 printf(" %.2x", start[i]); 10 printf("\n"); 11 } 12 13 void show_int(int x) 14 { 15 show_bytes((byte_pointer)&x, sizeof(int)); 16 } 17 18 void show_float(float x) 19 { 20 show_bytes((byte_pointer)&x, sizeof(float)); 21 } 22 void show_pointer(void *x) 23 { 24 show_bytes((byte_pointer)&x, sizeof(void *)); 25 } 26 27 void test_show_bytes(int val) 28 { 29 int ival = val; 30 float fval = (float)ival; 31 int *pval = &ival; 32 show_int(ival); 33 show_float(fval); 34 show_pointer(pval); 35 } 36 37 int main() 38 { 39 int num = 0x1926; 40 test_show_bytes(num); 41 42 return 0; 43 }
結語
大多數Inter兼容機只用小端法,Android和IOS也只用小端法;IBM和Oracle的大多數機器用大端法,但它們的制造的個人電腦使用的是Inter兼容的處理器,因此使用小端法。
令人吃驚的是,對於哪種字節順序更合適這個問題,人們表現的非常情緒化,從它的名字來源就可看出
【“端”的起源】
術語“little endian(小端)”和“big endian(大端)”出自Jonathan Swift的《格列佛游記》一書,其中兩個派別交戰的原因僅僅因為一方認為要從較大的一端敲開雞蛋,而另一方認為要從小的一端敲開雞蛋。
在作者的那個年代,Swift是借此諷刺英國和法國之間的持續沖突(難道命名者也是借此諷刺大端法和小端法的矛盾,,,只是臆想,蒟蒻什么也沒說)
參考資料:
1、https://blog.csdn.net/zuyi532/article/details/8020712