码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C语言大小端速通


    文章目录

    • 一、认识大小端
      • 1、大小端是什么?
      • 2、具体大小端是怎么存储的?
      • 3、为什么要需要大小端?
    • 二、大小端使用
      • 1.大小端判定
      • 2.大小端转换

    一、认识大小端

    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

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

  • 相关阅读:
    clang在编译时指定目标文件所需的最低macOS版本
    Xilinx 7系列 clock IP核的使用(三)
    resetFields()报错
    树莓派(香橙派)通过.NET IoT 操作SPI编写屏幕驱动 顺手做个四足机器人(一)
    可编程直流回馈式负载箱的工作原理
    【Java面试】Redis存在线程安全问题吗?为什么?
    Megatron-LM GPT 源码分析(一) Tensor Parallel分析
    龙讯旷腾PWmat发PRL:多k点计算的NAMD方法应用于小型超胞与在等效的大型超胞中进行的单个Γ点模拟之间的一致性
    Shiro与web的整合
    Python基础内容训练5(常用的数据类型-----字典)
  • 原文地址:https://blog.csdn.net/weixin_46185705/article/details/126356318
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号