数据在内存分布——大小端
概念
大小端(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