回忆大端序和小端序

一个地址存储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~

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