大端小端字节序
大端小端字节序
在计算机中,多字节对象被存储在连续的字节序列中,这就引出了存储字节顺序的问题。这一概念就被称为主机字节序。
主机字节序分为两种模式:
- 大端字节序(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中规定网络字节序就是大端字节序。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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)