说明:大端小端模式并无优劣之分。考虑大小端存储模式影响的一个典型场景是网络通信,两台计算机通过网络传送数据时,需要考虑不同主机之间字节序是否相同,如果不同,比如发送方按大端字节序发送数据,接收方却按小端字节序解析,那么就接收不到正确的数据。
为解决此问题,一般发送方可以将数据转化为网络字节序传输,而接收方将网络字节序转化为本地主机的字节序,为此,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;
}