大端小端講解

CoderTan發表於2020-12-17

小端,也稱低尾端,大端,也稱高尾端。首先弄清楚三個概念:

1)什麼是端/尾端:大端和小端裡面的端實際上是尾端的簡寫,就是尾巴的意思,很多動物尾巴被砍掉不會危及生命,和砍頭相比,是小傷,一個bit序列,尾巴部分錯了,對整體的值影響最小,因此也叫做LSB(Least Significant Bit),與之對應的,就是頭,最重要的部位,叫做MSB(Most Significant Bit),總結下,端/尾端的意思就是LSB。

2)什麼是小(低)/大(高):指的是記憶體地址,在前面的是低地址,在後面的是高地址。

弄清上面兩個概念後,總結下:

1)什麼是小端:直譯:端放在小地址。意譯:LSB放在低地址。

2)什麼是大端:直譯:端放在大地址。意譯:LSB放在高地址。

3)總結1)2),看是大端還是小端,你實際是在看什麼:很簡單,你實際在看LSB是放在高地址還是低地址上。

舉個例子:十進位制數字12496,以小端(低尾端)存放和以大端(高尾端)存放分別是什麼樣子的。

12496這個數字,用二進位制表示是:00110000 11010000,兩個位元組就可以表示了,用十六進位制表示:0x30 0xD0。

二進位制表示和十六進位制表示是等價的,00110000對應0x30,11010000對應0xD0,下面以十六進位制來說明。

首先要弄清楚哪個位元組是LSB,先澄清一下,這裡的B你把它理解成byte,以位元組為單位,0xD0是LSB,因此就很清楚了,0xD0放在低地址就是小端,放在高地址就是大端:

小端儲存:0xD0 0x30。

大端儲存:0x30 0xD0。

你可以發現,大端儲存的位元組序列和原始表示的位元組序列是一致的,因此大家通常也說,大端更符合人的直觀表示,小端還得逆序排列一下。

另外,補充一點,memcpy這個函式,是大端儲存。還是上面的例子:

unsigned short a=12496;

unsigned char buff[2]={0};

memcpy(buff,&a,sizeof(int));

buff裡面的位元組序列會是:0x30 0xD0。

相關文章