上一篇下一篇时间复杂度 O(1) 和 O(n)C 语言编译器的优化功能目 录大端和小端1定义与区别√2如何判断系统是大端还是小端√3示例3.1区别3.2判断方法4了解的重要性大端和小端大端Big-Endian和小端Little-Endian是两种不同的字节序Endianness用于定义多字节数据如 16 位、32 位整数或浮点数在计算机内存中的存储顺序。它们的核心区别在于数据的 “高位字节” 和 “低位字节” 在内存中存放的先后顺序不同。首先我们要了解三个概念高位字节 (High-order byte)指一个数值中权重最高的字节即最左边的字节。低位字节 (Low-order byte)指一个数值中权重最低的字节即最右边的字节。内存地址内存是由一系列连续的地址组成的地址从低到高排列0x00、0x01。现在我们可以来了解大端和小端的定义和区别是什么1定义与区别√大端模式规则高位字节存放在低地址低位字节存放在高地址。特点常用于网络协议如 TCP/IP 中的“网络字节序”就是大端、某些处理器架构如 PowerPC, SPARC, MIPS 的部分模式。小端模式规则低位字节存放在低地址高位字节存放在高地址。特点这种方式便于 CPU 从低地址开始逐字节读取数据时能快速获取到数值的低位部分对于加法等运算有潜在优势。广泛应用于 x86/x64 架构的 PC、以及绝大多数 ARM 处理器ARM 支持大小端但通常配置为小端。记忆诀窍大端“大”对应“高”所以高位字节放在低地址开头。小端“小”对应“低”所以低位字节放在低地址开头。小端模式用的广泛一些。2如何判断系统是大端还是小端√方法一使用联合体union{shortvalue;// 0x1234charbytes[2];// bytes[0]是低地址}test;test.value0x1234;if(test.bytes[0]0x34)printf(小端系统\n);elseprintf(大端系统\n);原理联合体union的所有成员共享同一块内存起始地址相同。当你给value赋值0x1234后这块内存就按 CPU 的字节序存放这两个字节。bytes[0]对应内存最低地址的那个字节如果低地址存低位 →bytes[0] 0x34则是小端如果低地址存高位 →bytes[0] 0x12则是大端方法二使用指针变换工业常用intcheckEndian(){intvalue1;char*p(char*)value;return*p;// 1为小端0为大端}原理整数1是int型其十六进制是0x0000000132 位4 字节。它的最低有效字节LSB是0x01其余都是0x00。取value的最低地址的值最低的那个字节的值value是value的起始地址在 C 中数组和对象的起始地址就是其最低地址(char*)强制转换为字符指针指针变量p现在指向内存中value的起始地址最低地址解引用*p若为1则为小端若为0则为大端起始地址的字节是0x01则*p 1→小端低位在低地址起始地址的字节是0x00则*p 0→大端高位在低地址3示例3.1区别假设我们有一个 16 位2 字节的十六进制数0x1234其中0x12是最高位字节权重最大0x34是最低位字节权重最小现在我们要把这个数存储在内存中起始地址为0x1000。那么两种模式下的存储情况分别为大端模式内存地址存储的数据0x10000x120x10010x34小端模式内存地址存储的数据0x10000x340x10010x123.2判断方法新建如下 C 程序#includestdio.hintmain(){/* 方法一联合体 */union{shorts;charc[2];}u;u.s0x1234;printf(%s\n,u.c[0]0x34?小端:大端);/* 方法二指针 */intx1;char*p(char*)x;printf(%s\n,*p?小端:大端);// 条件运算符, *p为1(真)则输出小端, *p为0(假)则输出大端return0;}运行结果为小端 小端4了解的重要性跨平台数据交换:当两台使用不同字节序的设备通过网络或文件交换数据时如果不对字节序进行转换接收到的数据就会被错误解读。例如网络协议如 IP、TCP规定使用大端序网络字节序发送方如果是小端机器需要调用htonl()/htons()等函数将数据转换为网络字节序接收方再用ntohl()/ntohs()转换回来。比如如下大端序配置在keil中的代码/* 默认远端IP为:192.168.1.134 */lwipx-remoteip[0]192;lwipx-remoteip[1]168;lwipx-remoteip[2]1;lwipx-remoteip[3]27;IP 地址的逻辑写法是192.168.1.27从左到右依次为 高字节 → 低字节而上述配置将 192 放在 ip[0] 即为将高字节放在低地址为大端序。不过数据传输时本身不分大小端模式先发哪个字节接收方就会收到对应字节除非软件层面设置先发的是小端模式的低地址数据那么接收方最先收到的就是发送方的低字节的数据因此为了让接收方能正确理解双方必须对“这个字节到底是高位还是低位”达成明确约定。比如蓝牙广播时有些蓝牙模块内部的MAC地址是小端模式存储的但是手机APP显示是大端序所以在手机上显示的MAC地址就是反着来的。-嵌入式开发和调试:在查看内存 dump 或调试变量时了解目标处理器的字节序对于正确解析数据至关重要。某些硬件外设可能要求特定的字节序。联合体 (union) 和类型转换:在 C 语言中利用union或指针强制类型转换来“拆解”多字节数时结果会直接受字节序影响。