• C语言大小端速通


    一、认识大小端

    1、大小端是什么?

    大小端是机器内存的存储方式,分为大端存储和小段存储。

    2、具体大小端是怎么存储的?

    大端:低位地址存储在内存高位
    小段:低位地址存储在内存低位

    图示:
    在这里插入图片描述

    3、为什么要需要大小端?

    因为数据会乱套,不同计算机的存储方式不一样。如果两台计算机需要进行通信,如果存储方式不一样。传输数据一个是小端传输,一个是大端接收。小端将内存中的数据“abcd”发送,大端接收并放在内存数据是“dcba”,数据就乱套了。

    如果提起发送端提前知道接收数据的大小端,或者约定好大小端,那么数据就不会出错。例如:小端内存中原数据是“abcd”,但是知道接收端是大端的模式,小端将发送的数据改为“dcba”,大端就能准确接收到原数据“abcd”到内存中了。

    二、大小端使用

    1.大小端判定

    大小端判定是用内存的存储方式的特点进行判断。判断方法一般有两种,一种是联合体法(需要知道联合体的存储特点),一种是利用指针的方法。其核心都是读取多于两位的数据的低位,查看低位数据数据是否存放在低位。

    //判断大小端
    //联合体法
    union Dx
    {
        int a;
        char c;
    }un;
    int judgeDx()
    {
        un.a=1;
        if(un.c==1) return 0;//小端,内存低位存放低字节
        else return 1;//大端
    }
    //指针法
    int judgePx()
    {
        int a=1;
        char *c=(char *)&a;//获取数据低位
        if(*c==1) return 0;//小端,内存低位存放低字节
        else return 1;//大端
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2.大小端转换

    大小端转换也是利用内存的存储特点进行转换的,其核心也就是交换位置。将高地址内存放到低地址内存,或者将低地址内存放到高地址内存中。

    大小端转换一般会利用移位操作,或者其他内存交换操作。我这里写了一个效率不算高的,但是通用性好的大小端转换的函数。移位操作下面也可以提高学习。

    /*移位法,效率相对高*/
    #define SWP16(X)   (( ((uint16)(X) & 0xff00) >> 8)    | \  
    (( (uint16)(X) & 0x00ff) << 8))  
     
    #define SWP32(X)   ((( (uint32)(X) & 0xff000000) >> 24) | \  
    (( (uint32)(X) & 0x00ff0000) >> 8)   | \  
    (( (uint32)(X) & 0x0000ff00) << 8)   | \  
    (( (uint32)(X) & 0x000000ff) << 24)) 
    
    /*大小端转换,双指针法,通用性好,但需要注意内存越界*/
    void LargeSmallConver(void *data,int size)
    {
        unsigned char tmp;
        unsigned char *tdata=(unsigned char *)data;/*逐字节操作*/
        int hight=size-1,low=0;
        /*交换高低地址的数据*/
        while(low<hight)
        {
            tmp=tdata[low];
            tdata[low]=tdata[hight];
            tdata[hight]=tmp;
            low++;
            hight--;
        }
    }
    
    int main()
    {
        int i;
        char test[4]={'a','b','c','d'};
        printf("before %s\r\n",test);//输出abcd
        LargeSmallConver(test,sizeof(test));
        printf("after %s\r\n",test);//dcba
        system("pause");
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    双指针法图解:
    在这里插入图片描述

  • 相关阅读:
    TOML配置文件格式,YAML最有力的竞争者
    开源量子开发框架 Cirq
    刷题记录:牛客NC15447wyh的问题
    网站出现403 Forbidden错误的原因以及怎么解决的方法
    单片机灭火避障小车设计
    tomcat动静分离
    【Apache Flink】实现有状态函数
    BOM介绍以及应用以及this指向问题
    Window对象的说明》
    Vim基础
  • 原文地址:https://blog.csdn.net/weixin_46185705/article/details/126356318