大小端模式

来源:互联网 发布:手机淘宝设置在哪 编辑:程序博客网 时间:2024/06/18 18:29

大小端模式


什么是大小端模式


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;}