1:认识
对于一个int类型的数字,如int data=0x01234567; 最高位是0x01 最低位是 0x67
大端存储: 高位字节排在内存的低地址,低位字节排在内存的高地址端 ==》符合我们的阅读
小端存储:低位字节排在内存的低地址 高位字节排在内存的高地址端 ==》计算机电路先处理低位字节,效率较高
2:demo
//测试本机是大端还是小段:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
int main()
{
int data=0x01234567; //高字节是0x01
//以十六进制输出数据 及该数据对应的地址
printf("data:[%x] data_addr:[%p] \n",data, &data);
char *c_data = (char *)&data;
for(int i=0; i<4;i++)
{
printf("addr[%p]==>%x \n", c_data+i, *(c_data+i));
}
//高位字节排在内存的低地址,低位字节排在内存的高地址端 为大端
//低位字节排在内存的低地址 高位字节排在内存的高地址端 为小端
if(*c_data == 0x01) //低位存高字节
{
printf("this is big endian\n");
}else{
//低位存低字节
printf("this is little endian\n");
}
//字节序的转换
data = htonl(data);
printf("data is :%x data_addr:[%p] \n", data, &data);
for(int i=0; i<4;i++)
{
printf("addr[%p]==>%x \n", c_data+i, *(c_data+i));
}
return 0;
}
/*************************************************
hlp@ubuntu:~/0922$ ./big
data:[1234567] data_addr:[0x7ffcd98f44a8]
addr[0x7ffcd98f44a8]==>67
addr[0x7ffcd98f44a9]==>45
addr[0x7ffcd98f44aa]==>23
addr[0x7ffcd98f44ab]==>1
根据输出结果,说明我的电脑内存是小端
计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。
所以,计算机的内部处理都是小端字节序。
但是,人类还是习惯读写大端字节序。
所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,
比如网络传输和文件储存
*************************************************/