码农知识堂 - 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

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

  • 相关阅读:
    java-net-php-python-jspm环保手工制品交流网设计计算机毕业设计程序
    分类预测 | Matlab实现NGO-CNN-SVM北方苍鹰算法优化卷积支持向量机分类预测
    小程序 语音搜索功能,语音识别翻译成文本进行搜索
    java计算机毕业设计吉他库存管理源码+mysql数据库+系统+lw文档+部署
    Python技法:实现简单的递归下降Parser
    伪原创工具-好用的伪原创软件有哪些特征
    【Leetcode】236. 二叉树的最近公共祖先
    【设计模式】【创建型5-2】【工厂方法模式】
    删除链表的倒数第n个节点
    Eye Tracking for Everyone
  • 原文地址:https://blog.csdn.net/weixin_46185705/article/details/126356318
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号