计算机数据存储大小端模式

一. 大端模式(Big - Endian)

定义

在大端模式中,数据的高位字节存于低地址,低位字节存于高地址。就好像按照从左到右(高位到低位)的顺序依次存储数据。

示例

假设要存储一个16位的整数0x1234(在内存中占两个字节)。在大端模式下,低地址存储0x12(高位字节),高地址存储0x34(低位字节)。如果用一个字节数组char buffer[2];来存储这个整数,那么buffer[0]=0x12,buffer[1]=0x34。

应用场景

大端模式在网络协议中被广泛使用。例如,在IP协议、TCP协议等网络协议中,数据在网络上传输时通常采用大端模式。这样做的好处是,在不同的计算机体系结构之间传输数据时,可以方便地按照高位在前的顺序解析数据,使得网络通信更加统一和规范。

二. 小端模式(Little - Endian)

定义

与大端模式相反,小端模式下数据的低位字节存于低地址,高位字节存于高地址。

示例

对于同样的16位整数0x1234,在小端模式下,低地址存储0x34(低位字节),高地址存储0x12(高位字节)。如果用字节数组char buffer[2];存储,那么buffer[0]=0x34,buffer[1]=0x12。

应用场景

许多微处理器(如x86架构)采用小端模式。这在一些本地的、以字节为单位进行快速读写和处理数据的场景下可能更方便,因为可以直接从低地址开始读取数据的低位部分,符合一些硬件对数据操作的逻辑顺序。

三. 大小端模式的检测方法

利用联合体(Union)

可以利用C/C++中的联合体特性来检测系统的大小端模式。联合体中的所有成员共享同一块内存空间。

例如:

#include <iostream>
union EndianTest {
    int num;
    char bytes[4];
};
int main() {
    EndianTest test;
    test.num = 0x12345678;
    if (test.bytes[0]==0x78) {
        std::cout << "Little - Endian" << std::endl;
    } else {
        std::cout << "Big - Endian" << std::endl;
    }
    return 0;
}

利用指针类型转换

另一种方法是通过指针类型转换来检测。

例如:

#include <iostream>
int main() {
    int num = 0x1234;
    char* ptr = (char*)&num;
    if (*ptr == 0x34) {
        std::cout << "Little - Endian" << std::endl;
    } else {
        std::cout << "Big - Endian" << std::endl;
    }
    return 0;
}


C++编程语言基础

计算机数据存储大小端模式