大小端模式
什么是大小端模式
1)大端模式,小端模式
2)通信协议中,发送方和接收方必须按同样的字节顺序来通信,否则会出错。
常见的,在socket通信中,常用到的函数:hton(),定义端口号或者ip地址时,需要考虑字节序。
3)除了通信协议,在计算机存储系统中也有大小端
一个32位的2进制在内存中存储时有两种发布方式:
图示如下:高字节 对应 高地址 --------------> 小端模式
高字节 对应 低地址 --------------> 大端模式
大小端存在的意义
1)在通信协议中,大小端模式是非常重要的。
2)在实际中,有些CPU用的是大端,有些则是小端,如不加以区别的话,可能会出现读取时和储存时字节顺序不一致的情况,从而造成数据的错误。
3)网络通信中一般为大端模式,常用计算机CPU为小端模式。
如何判断
用共用体union或指针可以测试出
共用体union测试
union myunion { int a; char b; }; // int is_little(void) { union myunion u1; u1.a = 1; return u1.b; } int main(int argc, const char * argv[]) { // insert code here... int i = is_little(); if (i == 1) { printf("little\n"); }else{ printf("big\n"); } return 0; }
图示如下:
共用体union与结构体struct
1)在定义和用法上很相似:
struct mystruct { int a; char b; }; union myunion { int a; char b; long c; int d[10]; };
int main(int argc, const char * argv[]) { // insert code here... struct mystruct s1; s1.a = 23; printf("s1.b = %d\n", s1.b); // s1.b = 0 union myunion u1; u1.a = 23; printf("u1.b = %d\n", u1.b); // u1.b = 23 printf("u1.a地址 = %p\n", &u1.a); // u1.a地址 = 0x7fff5fbff7b0 printf("u1.b地址 = %p\n", &u1.b); // u1.b地址 = 0x7fff5fbff7b0 // 说明u1.a和u1.b是共用的 return 0; }
2)不同之处:
① 结构体中的成员是相互独立的
② 共用体中的成员是一体的,彼此是不独立的,共使用同一个内存单元。
共用体因为只有一个共用的空间,所以不存在内存对齐的问题
union的大小为成员中最大的那个的大小
指针方式测试
int is_little(void) { int a = 1; char b = *((char *)(&a)); return b; } int main(int argc, const char * argv[]) { // insert code here... int i = is_little(); if (i == 1) { printf("little\n"); }else{ printf("big\n"); } return 0; }