回憶大端序和小端序

一個地址存儲8位數據,也就是1字節
對於棧空間數據,地址從上向下增長(從高向低增長)
對於堆空間數據,地址從下向上增長(從低地址向高地址)

對於大端序和小端序的概念不再贅述
大端序:高位數據存在低地址;
小端序:高位數據存在高地址;

union w
{
	int a;
	char b;
} c;
int checkCPU()
{	
	c.a = 1;
	return (c.b == 1);
}
// 返回 1 則爲小端序,反之爲大端序

解釋:
存儲:如果爲大端序:高位地址存儲0x01
如果爲小端序:低位地址存儲0x01

而c.b的訪問是從低位地址開始讀取一個字節的數據;
這是union的特性,共享內存空間;
如果我們訪問a:則從低位地址開始讀取數據,並按照CPU的大小端對數據進行解析;

舉例:
假設將上面的賦值語句替換爲:c.a = 0x01 00 00 02;
一:CPU爲大端序:反着存
低位地址->高位地址: 0x01, 0x00, 0x00, 0x02
讀取c.b:0x01
讀取c.a: 0x01,0x00,0x00,0x02 -> 解析:因爲是大端序,所以先讀出來的低地址數據爲高位數據,解析得到c.a = 0x00 00 00 01;

二:CPU爲小端序:
低位地址-> 高位地址:0x02 0x00 0x00 0x01
讀取c.b: 0x02
讀取c.a:0x02 0x00 0x00 0x01 -> 解析:因爲是小端序,所以先付出來的低地址數據爲低位數據,解析得到c.a = 0x01 00 00 02;

over~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章