首页 > 其他分享 >【漫谈C语言和嵌入式002】嵌入式中的大小端

【漫谈C语言和嵌入式002】嵌入式中的大小端

时间:2024-08-16 19:23:50浏览次数:13  
标签:小端 存储 内存地址 字节 模式 C语言 002 Endian 嵌入式

        在计算机科学中,"端序"(Endianness)是指多字节数据类型(如整数或浮点数)在内存中的存储方式。主要分为两种:大端模式(Big-Endian)和小端模式(Little-Endian)。

大端模式 (Big-Endian)

       在大端模式中,多字节数据类型的最高有效字节(MSB)被存储在最低的内存地址上,而最低有效字节(LSB)则被存储在最高的内存地址上。这种存储方式与人类通常读数的方式一致,因此有时也被认为是“自然”的顺序。

小端模式 (Little-Endian)

        在小端模式中,情况正好相反,最低有效字节(LSB)被存储在最低的内存地址上,而最高有效字节(MSB)则被存储在最高的内存地址上。

举例说明

        以一个16位无符号整数 0x1234(十进制为4660)为例,来看一下在大端模式和小端模式下,它在内存中的布局:

大端模式

        假设我们有一个支持大端模式的嵌入式系统,比如一个基于 ARM 的微控制器配置为大端模式。当我们将 0x1234 写入到内存时,它的存储方式如下:

  • 内存地址:0x0000 | 0x0001
  • 存储值: 0x12 | 0x34

        高位字节 0x12 被存储在最低的地址 0x0000 上,而低位字节 0x34 则被存储在较高的地址 0x0001 上。

小端模式

        现在假设我们有一个支持小端模式的嵌入式系统,例如一个 x86 架构的微控制器。当我们将 0x1234 写入到内存时,它的存储方式如下:

  • 内存地址:0x0000 | 0x0001
  • 存储值: 0x34 | 0x12

        低位字节 0x34 被存储在最低的地址 0x0000 上,而高位字节 0x12 则被存储在较高的地址 0x0001 上。

实际应用

        在嵌入式系统开发中,了解处理器的字节序是非常重要的,因为这直接影响到数据的处理和传输。例如,当你从串行接口接收数据时,如果你的处理器是小端模式的,而发送方是大端模式的,那么你可能需要在接收后重新排列字节的顺序才能正确解析数据。

如何判断大小端:

        可以定义一个整数变量,并将其设置为一个特定的值,然后通过比较该值的低位字节来确定系统的字节序。

#include <stdio.h>

int main() {
    // 定义一个整型变量,并给它赋一个特定的值
    int testValue = 0x01020304;

    // 使用 union 来访问整型变量的各个字节
    union {
        int asInt;
        char asChar[4];
    } byteUnion;

    byteUnion.asInt = testValue;

    // 检查最低位的字节
    if (byteUnion.asChar[0] == 0x01) {
        printf("This system is in Big-Endian mode.\n");
    } else if (byteUnion.asChar[0] == 0x04) {
        printf("This system is in Little-Endian mode.\n");
    } else {
        printf("Cannot determine endianness.\n");
    }

    return 0;
}

标签:小端,存储,内存地址,字节,模式,C语言,002,Endian,嵌入式
From: https://blog.csdn.net/2403_83044722/article/details/141267398

相关文章

  • C语言学习 --- 冒泡排序与二分查找
    冒泡排序 排序        从小到大顺序排 轮数        数据个数-1 每一次比较的次数      数据个数-1-当前的轮数      每次比较开始从下标为0的地方开始比较     轮数:0~<数据个数-1次数:0~<数......
  • 2024杭电多校第十场 1002树上询问(题解)
    题意给一棵树,每个节点有一个权值,并且权值是一个排列。接下来有多次操作,每次操作要么是交换两个节点权值,要么是询问一个权值区间\([L,R]\),判断是否存在树上的一个路径,使得路径上的权值恰好都在这个区间里分析由于询问的是树上的一个路径,联想到了树上莫队中对路径的处理。这里......
  • 【萌新学习C语言】如何根据qsort库函数,写一个能给任何类型排序的冒泡排序。
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、sqort函数1.1qsort函数定义1.2qsort如何使用函数使用1.2.1用qsort函数,将结构体类型的name进行排序1.2.2用qsort函数,将结构体类型的age进行排序二、整数型的冒泡排序2.1冒泡排序思想三.......
  • Bluetooth Profile Specification之 HFP简介与嵌入式
    BluetoothProfileSpecification丰富了蓝牙技术的应用领域,其中包括了HFP(Hand-FreeProfile)——一个在嵌入式系统中广泛使用的蓝牙配置文件,本文将重点介绍HFP的相关信息,并提供相关的源代码示例。HFP是为了提供嵌入式设备与蓝牙手机之间的音频通信而设计的,通过支持HFP嵌入式设......
  • STM8 窗口看门狗实验:保护嵌入式系统的可靠性与稳定性
    嵌入式系统在各个领域中扮演着重要的角色,因此确保其可靠性和稳定性至关重要,本文将介绍如何利用STM8微控制器的窗口看门狗(IWDG)功能,来保护嵌入式系统的运行,我们还将提供相应的源代码示例,以帮助读者理解和实施这一功能。看门狗定时器是一种硬件模块,用于监控系统在预定时间内是否......
  • 【C语言实现花屏效果并打包程序为exe可执行文件】
    说明:该程序为临摹改良(......
  • 【C语言题目】计算某字符出现次数
    描述题目描述写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)数据范围:1≤n≤1000输入描述第一行输入一个由字母、数字和空格组成的字符串,第二行输入一个字符(保证该字符不为空格)输出描述输出......
  • 嵌入式开发应该具备的思维方式
    能从PC机器编程去看嵌入式问题,那是第一步;学会用嵌入式编程思想,那是第二步;用PC的思想和嵌入式的思想结合在一起,应用于实际的项目,那是第三步。很多朋友都是从PC编程转向嵌入式编程的。在中国,嵌入式编程的朋友很少是正儿八经从计算机专业毕业的,都是从自动控制啊,电子相关的专......
  • 编程基础题:开关灯(C语言方式代码,C++方式代码,Python3方式编写)三种语言编写代码
    1.题目描述:假设有N蓋灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以......
  • C语言学习--常量
    提示:在程序设计中,常量是一个至关重要的概念。目录前言4.1基本介绍4.2经常使用的常量4.2.1整数常量4.2.2浮点常量4.2.3字符常量4.2.4字符串常量4.2.5案例演示4.3常量的定义4.3.1定义常量的两种方式4.4#define预处理器4.5const关键字4.6const和#defin......