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

        在计算机科学中,"端序"(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;
}

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值