产生大小端问题的原因
因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中存在不同的数据类型,他们所占的字节数各不相同。另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
从软件角度来看,内存相对于一个大得字节数组,其中每个数组元素都是可寻址的.
目前有两种内存模式即 大端模式(big-endian)和小端模式(little-endian)
判断大小端模式
int main()
{
int little_endian = 0x12345678;
char num = *(char*)&little_endian;
if(num == 0x78)
printf("小端模式\n");
else
printf("大端模式\n");
return 0;
}
//除此之外还可以使用共用体
union typeA{
int a;
char b;
};
应用场景
1、不同端模式的处理器进行数据传递时必须要考虑端模式的不同
2、在网络上传输数据时,由于数据传输的两端对应不同的硬件平台,采用的存储字节顺序可能不一致。网络字节顺序是大端模式。对于char型数据只占一个字节,无所谓大端和小端。而对于非char类型数据,必须在数据发送到网络上之前将其转换成大端模式。接收网络数据时按符合接受主机的环境接收,我们在写网络程序的时候要注意这方面的问题。
uint16_t htons(uint16_t hostshort); // 端口号 本地字节序转网络字节序
uint16_t ntohs(uint16_t netshort); // 端口号 网络字节序转本地字节序