大端小端字节序

大端小端字节序

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

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

  • 大端字节序(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 @   HachikoT  阅读(277)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示