大端模式与小端模式

小端机(Little-Endian)/大端机(Big-Endian)

  • Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
  • Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
  • Intel X86 平台一般为小端机

举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:

  • 大端模式:

    低地址 —————–> 高地址
    0x12 | 0x34 | 0x56 | 0x78

  • 小端模式:

    低地址 ——————> 高地址
    0x78 | 0x56 | 0x34 | 0x12

  • 大端小端没有谁优谁劣,各自优势便是对方劣势:

    小端模式 :强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
    大端模式 :符号位的判定固定为第一个字节,容易判断正负。

大小端的判断

使用 union

bool isLittleEndian()
{
    union
    {
        int a;
        char b;
    } foo;
    foo.a = 1;
                            // 00 00 00 01
    return foo.b == 1;
                            // 保留最前的 00,也即高位字节存放在低地址,为大端机
                            // 还是最后的 01,也即低位字节存放低地址,为小端机
}

int ==》 char[4]

仍然是妙不可言的 union

union
{
    unsigned int a;
    unsigned char buf[4];
} foo;
foo.a = 0x12345678;
printf("%x, %x, %x, %x\n", foo.buf[0], foo.buf[1], foo.buf[2], foo[3]);
                        // 小端机的输出为:78, 56, 34, 12
                        // 大端机的输出为:12 34 56 78

方法之二:

unsigned int a = 0x12345678;
unsigned char bytes[4];
bytes[0] = (a >> 24) & 0xff;
bytes[1] = (a >> 16) & 0xff;
bytes[2] = (a >> 8) & 0xff;
bytes[3] = a & 0xff;

References

[1] Converting an int into a 4 byte char array (C)

[2] 详解大端模式和小端模式

你可能感兴趣的:(大端模式与小端模式)