数据在内存分布——大小端

数据在内存分布——大小端

概念

大小端(Endianness)是一种描述数据在内存中存储方式的概念。它涉及到多字节数据类型(如整数、浮点数)在内存中的字节顺序排列。

  • 大端存储(Big Endian):在大端存储中,较高有效字节(Most Significant Byte,MSB)存储在较低的内存地址,而较低有效字节(Least Significant Byte,LSB)存储在较高的内存地址上。

  • 小端存储(Little Endian):在小端存储中,较低有效字节(LSB)存储在较低的内存地址,而较高有效字节(MSB)存储在较高的内存地址上。

下面以一个4字节整数(例如32位整数)为例,来说明大端存储和小端存储的区别:

数值:0x12345678
内存地址:0x1000        0x1001        0x1002        0x1003
大端存储:0x12          0x34          0x56          0x78
小端存储:0x78          0x56          0x34          0x12

在大端存储中,最高有效字节0x12存储在最低地址0x1000,而最低有效字节0x78存储在最高地址0x1003。而在小端存储中,最低有效字节0x78存储在最低地址0x1000,最高有效字节0x12存储在最高地址0x1003。

需要注意的是,大小端存储的影响通常体现在跨平台或网络通信等需要考虑数据一致性的场景中。大多数个人计算机和x86架构的处理器使用小端存储,而一些其他架构(如ARM、PowerPC)以及网络协议(如TCP/IP)中的数据传输通常使用大端存储。因此,在处理数据时,需要注意存储方式的差异,以确保数据的正确解释和传输。

通过代码判断大小端

#include <iostream>

union EndianChecker {
    int value;
    char bytes[sizeof(int)];
};
bool is_smallEndian(){
    EndianChecker checker;
    checker.value = 1;
    return checker.bytes[0] == 1;
}
int main() {
    bool flag = is_smallEndian();
    

    if (flag) {
        std::cout << "This machine is using little-endian storage." << std::endl;
    } else {
        std::cout << "This machine is using big-endian storage." << std::endl;
    }

    return 0;
}

github链接:https://github.com/mulinhu/CPPer/tree/main/util/endian_demo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值