大端小端字节序

大端小端字节序

在计算机中,多字节对象被存储在连续的字节序列中,这就引出了存储字节顺序的问题。这一概念就被称为主机字节序。

主机字节序分为两种模式:

  • 大端字节序(Big Endian):高位字节存储在低位地址,低位字节存储在高位地址。
  • 小端字节序(Little Endian):低位字节存储在低位地址,高位字节存储在高位地址。

例如对于int n = 0x01020304,假设int大小为4字节,并且该int对象的地址为0x100,那么在大端机器和小端机器上内存布局如下图:

内存地址 0x100 0x101 0x102 0x103
大端字节序 0x01 0x02 0x03 0x04
小端字节序 0x04 0x03 0x02 0x01

判断主机字节序

主机字节序不是由操作系统决定的,而是由CPU指令集架构决定的。各架构处理器的字节序如下:

  • x86(Intel、AMD)、MOS Technology 6502、Z80、VAX、PDP-11 等处理器为小端序。
  • Motorola 6800、Motorola 68000、PowerPC 970、System/370、SPARC(除 V9 外)等处理器为大端序。
  • ARM(默认小端序)、PowerPC(除 PowerPC 970 外)、DEC Alpha、SPARC V9、MIPS、PA-RISC 及 IA64 的字节序是可配置的。

可以自己写一个简单的程序判断当前的主机字节序。

#include <stdio.h>
#include <stdint.h>

union byte_order
{
    int32_t whole;
    int8_t parts[4];
};

int is_little_endian()
{
    union byte_order bo = {.whole = 0x01020304};
    return bo.parts[0] == 0x04;
}

int main(void)
{
    if (is_little_endian())
    {
        printf("Little Endian Machine\n");
    }
    else
    {
        printf("Big Endian Machine\n");
    }

    return 0;
}

网络字节序

网络字节序是 TCP/IP 中规定的字节顺序,它与具体的 CPU 类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。

在TCP/IP中规定网络字节序就是大端字节序。

参考资料

posted @ 2020-01-04 16:33  HachikoT  阅读(274)  评论(0编辑  收藏  举报