大端字节序和小端字节序
大端字节序是符合人类阅读习惯的字节序,高地址存在低位,低地址存在高位。
小端字节序的排序方式对于cpu寻址更为便捷,低地址存在低位,高地址存在高位。
一个数据
0x01234567
大端字节序存储的方式是:
0x01234567
小端字节序存储的方式是:
0x67452301
如何测试主机字节序
void main()
{
int a = 0x01234567;
char* p = (char*)&a;
printf("%x\n",*p);
printf("%x\n", *++p);
printf("%x\n", *++p);
printf("%x\n", *++p);
}
//windows 输出
67
45
23
1
//kernel 4.4.0
67
45
23
1
为什么会有小端字节序
回忆一下,人类读取数字是怎么读的?
12345 读作**1万2千3百4十5**
**是从高位到低位去读的**,读时候
1. 获取了**数据位数**
2. 获取了**数据每一位的数值**
这样才叫处理完这个数据了。
对于计算机而言呢
计算机从低位获取数据这样效率会比较高,因为他还涉及从低位做加法进位的问题呢,也就是说**计算机读取数据的时候是从个位->十位->百位->千位…**这样去读取的。
那么计算机读取数据是从低地址到高地址的,从0x0001…0x0002…0x0003这样去读的,那么自然他会这样去存储,即先存低位再存高位也就是小端字节序。
检测字节序方法,可以通过一个程序去实现:
void main()
{
int a = 0x01234567;
char* p = (char*)&a;
printf("%x,%02x\n",p,*p);
printf("%x,%02x\n", p, *++p);
printf("%x,%02x\n", p, *++p);
printf("%x,%02x\n", p, *++p);
}
//printf %02x 补0两位十六进制
//printf %04o 补0四位八进制