溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

最簡單的方式教你理解大小端字節(jié)序

發(fā)布時間:2020-07-21 22:01:00 來源:網絡 閱讀:14415 作者:暮回_zz 欄目:編程語言

   

    學過編程的人都應該知道大小端字節(jié)序的概念,但是很多時候,總是把他們弄混,這是整理出來的一份很簡單的方式理解字節(jié)序的文章,廢話不多說,這里直接入正題。


什么是字節(jié)序?最簡單的方式教你理解大小端字節(jié)序

    字節(jié)序,簡單來說,就是指的超過一個字節(jié)的數據類型在內存中存儲的順序

    

    那么就很明顯了,像char這樣的類型,肯定不存在字節(jié)序的問題了。


字節(jié)序分為哪幾類?最簡單的方式教你理解大小端字節(jié)序

大端字節(jié)序

     高位字節(jié)數據存放在低地址處,低位數據存放在高地址處;

小段字節(jié)序

     高位字節(jié)數據存放在高地址處,低位數據存放在低地址處;


網絡字節(jié)序:

     TCP/IP協(xié)議傳輸數據時,字節(jié)序默認大端


    其實字節(jié)序只有大端字節(jié)序和小端字節(jié)序兩種,網絡字節(jié)序也是大端,這個以后會說到。關于大小端字節(jié)序的重點,上面已經標的很明顯了,一個是高低地址,一個是高低位字節(jié),那下面就看看這兩個是什么意思?


重點來了最簡單的方式教你理解大小端字節(jié)序


首先看什么是高地地址


     在內存中,棧是向下生長的,以char arr[4]為例,(因為char類型數據只有一個字節(jié),不存在字節(jié)序的問題)依次輸出每個元素的地址,可以發(fā)現,arr[0]的地址最低,arr[3]的地址最高,如圖:

 

最簡單的方式教你理解大小端字節(jié)序

接下來看什么是高低位

     

     給一個十進制整數,123456,很明顯左邊的是高位,右邊的是低位。計算機也是這樣認為的。給一個16進制數,0x12345678,以字節(jié)為單位,從高位到低位依次是 0x12、0x34、0x56、0x78。


下來將高地地址和高低位對應。

     一個×××占4個字節(jié),給一個×××數據0x12345678,如果是大端存儲,存儲格式如下:

最簡單的方式教你理解大小端字節(jié)序

如果是小端存儲,存儲格式如下:

最簡單的方式教你理解大小端字節(jié)序

那如何判斷當前系統(tǒng)是大端還是小端呢?


    最簡單地來說,我們可以用 1 為例,1在棧中存儲的大小端格式分別如下圖所示,


最簡單的方式教你理解大小端字節(jié)序

    如果我們可以得到 1 在內存中存儲的第一個字節(jié),那么我們就可以知道當前系統(tǒng)是大端存儲還是小端存儲了。


    測試代碼如下:

#include <stdio.h>
int main()
{
	int a = 1;
	char pc = *(char*)(&a);
	if (pc == 1)
		printf("第一個字節(jié)為1,小端存儲\n");
	else
		printf("第一個字節(jié)為0,大端存儲\n");

	return 0;
}

/*********測試代碼2***********/

#include <stdio.h>
union PORT
{
	int a;
	char c;
};
int main()
{
	union PORT p;
	p.a = 1;
	if (p.c == 1)
		printf("第一個字節(jié)為1,小端存儲\n");
	else
		printf("第一個字節(jié)為0,大端存儲\n");

	return 0;
}




    -----muhuzz整理

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI