首先先解释一下大小端的概念
大端就是数据的高字节存在内存的低地址,低字节存在内存的高地址
小端就是数据的高字节存在内存的高地址,低字节存在内存的低地址
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
union{
short s;
char c[4];
}un;
un.s = 010101;
if (un.c[0] == 16 && un.c[1] == 65)
printf("big-endian\n");
else if (un.c[0] == 65 && un.c[1] == 16)
printf("little-endian\n");
else
printf("unknown\n");
system("pause");
}
如何判断大小端
我们可以使用联合体,利用联合体的特性,所有元素都是从低地址开始存放,而且所有元素共享空间,由上面代码便可以判断大小端。通过判断,便可以知道我们所使用的机器是大端还是小端。当然大小端跟CPU和所使用的擦做系统有关,Intelx86CPU下的机器都是小端。
需要考虑大小端的场景
两台大小端不同的机器在网络上传输需要考虑大小端,因为大小端不同,字节存放次序不同,那么这时就需要转换大小端,这时就需要用到网络字节序。
网络字节序
在tcp/ip协议中把接收到的第一个字节当作高位字节看待,这要求发送端发送的第一个字节是高字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处),因此网络字节序是大端。