C语言---大端小端

大端小端的存在是为了解决计算机内字节存储排列问题,很多arm,dsp,以及x86系统采用的是小端模式,而keil C51采用的是大端模式,一般操作系统采用小端模式,而通讯协议是大端的。

大端:低位字节存放在内存的高地址端,高位字节存放在内存的低地址端(低高 高低)

小端:低位字节存放在内存的低地址端,高位字节存放在内存的高地址端(低低 高高)

例如:0x1234

0x1234 低地址 高地址
小端 34 12
大端 12 34

如何验证机器的字节序?

1.使用指针

#include<stdio.h>

int main(int argv,char *argc[])
{
	int a = 20;//0x0014   
	char *p = (char *)&a;
	//通过验证最低位是0还是1
	printf("p = %x",*p);
	printf("p+1 = %x",*(p+1));
	if(*p == 20)
	{
		printf("小端模式\n");
	}
	else
	{
		
		printf("大端模式\n");
	}

    return 0;
}

2.使用联合体

union:联合是在同一个存储空间存储不同类型数据,union数据类型所占空间等于其最大成员所占的空间,联合体访问都是从基地址开始的(从首地址开始)


#include<stdio.h>

int main(int argv,char *argc[])
{
	union{
		short a;
		char b[2];
	}u;
	u.b[0]= 0x12;
	u.b[1]= 0x34;
	
	printf("0x%x\n",u.a);

    return 0;
}

3.使用函数

主机字节顺序:小端

网络字节顺序:大端

htonl()     //32位无符号整型的主机字节顺序到网络字节顺序的转换(小端->>大端)
htons()     //16位无符号短整型的主机字节顺序到网络字节顺序的转换  (小端->>大端)
ntohl()     //32位无符号整型的网络字节顺序到主机字节顺序的转换  (大端->>小端)
ntohs()     //16位无符号短整型的网络字节顺序到主机字节顺序的转换  (大端->>小端
 

#include<stdio.h>
#include <arpa/inet.h>


int main(int argv,char *argc[])
{
	union{
		short a;
		char b[2];
	}u;
	u.b[0]= 0x12;
	u.b[1]= 0x34;
	
	printf("0x%x\n",u.a);
	printf("0x%x\n",htons(u.a));

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45604814/article/details/112388819