C语言:判断小端存储模式与大端存储模式

在这里插入图片描述
说明:大端小端模式并无优劣之分。考虑大小端存储模式影响的一个典型场景是网络通信,两台计算机通过网络传送数据时,需要考虑不同主机之间字节序是否相同,如果不同,比如发送方按大端字节序发送数据,接收方却按小端字节序解析,那么就接收不到正确的数据。

为解决此问题,一般发送方可以将数据转化为网络字节序传输,而接收方将网络字节序转化为本地主机的字节序,为此,C语言提供了一下函数完成这一功能。

htonl, htons, ntohl, ntohs - convert values between host and network byte order

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

判断大端小端存储模式,方法1:

include <stdio.h>

int main () {
	int a = 0x12345678;
	char *p = (char *)&a;
	
	int big_end = 0;
	for (char *t = p; t < p + sizeof(int); t++) {//大端存储模式,低地址为高位
		big_end = (big_end << 8) | *t;
	}

	int little_end = 0;
	for (char *t = p + 3; t >= p; t--) {//小端存储模式,高地址为高位
		little_end = (little_end << 8) | (int)*t;
	}
	
	printf("a = %d, big_end = %d, little_end = %d\n", a, big_end, little_end);
	if (little_end == a) printf("little end\n");;
	if (big_end == a) printf("big end\n");
	return 0;
}

判断大端小端存储模式,方法2:

include <stdio.h>

int main () {
	typedef union {
		int a;
		char bytes[sizeof(a)];
	}u_test;

	u_test u;
	u.a = 0x12345678;
	
	int big = 0;
	for (int i = 0; i < 4; i++) {//大端存储模式,低地址为高位
		big = big << 8 | u.bytes[i];
	}

	int little = 0;
	for (int i = sizeof(int) - 1; i >= 0; i--) {//小端存储模式,高地址为高位
		little = little << 8 | u.bytes[i];
	}
	
	printf("a = %d, big = %d, little = %d\n", a, big, little);
	if (little == a) printf("little end\n");;
	if (big == a) printf("big end\n");
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值