大小端模式

大小端模式


什么是大小端模式


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









评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值