一.大小端是什么以及为什么会出现大小端
1.为什么出现大小端?
一开始是由于不同架构的CPU处理多个字节数据的顺序不一样,比如x86的是小段模式,KEIL C51是大端模式。但是后来互联网流行,TCP/IP协议规定为大端模式,为了跨平台通信,还专门出了网络字节序和主机字节序之间的转换接口(ntohs、htons、ntohl、htonl)
2.大小端是什么?
大端存储模式:是指数据的低位保存在内存得高地址当中,而数据的高位保存在内存的低地址当中
小端存储模式:是指数据的高位保存在内存的高地址当中,而数据的低位保存在内存的低地址当中;
二.如何鉴别自己的机器的大小端?
简单处理,创建一个整形变量,存值为1,16进制表示为0x00 00 00 01也为小端存储模式,而0x 01 00 00 00 为大端存储模式对这个整型变量地址进行强制类型转换成char*类型,使得转换后每次只能访问一个字节,在判断类型转换后解引用的值是否为一,如果小端存储,低地址放低字节那访问一个字节就是01,而如果是大端字节存储,低地址放高字节,访问一个字节,值就为0。
代码演示:
代码语言:javascript复制#include<stdio.h>
int main()
{
int a = 1;
char *p = (char *)&a;//将整形地址强制类型转换为char*型则每次访问地址只访问一个字节
//1的十六进制为0x 00 00 00 01 也为小端字节序存储
//0x 01 00 00 00为大端字节序存储
if(*p == 1)
{
printf("机器为小端字节序存储n");
}
else
{
printf("机器为大端字节序存储n");
}
return 0;
}
可以看到我的机器为小端字节序存储。
当然,也有许多其他的判断大小端代码,这里就不一一提了,了解大小端存储模式会对后面指针学习有所帮助,也对内存有更进一步的认识。