news 2026/7/1 14:55:01

C语言大小端格式详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言大小端格式详解

C语言大小端格式详解

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习
🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发
❄️作者主页:一个平凡而乐于分享的小比特的个人主页
✨收录专栏:c语言重要知识点总结,本专栏旨在总结C语言学习过程中的易错点,通过调试代码,分析原理,对重要知识点有更清晰的理解
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

一、什么是大小端格式

大小端指的是多字节数据在内存中的存储顺序。

1.小端格式 (Little Endian)

  • 低字节存放在低地址
  • 高字节存放在高地址
  • 像Intel x86/x64、ARM(默认)使用小端
#include<stdio.h>intmain(){intnum=0x12345678;// 十六进制数unsignedchar*p=(unsignedchar*)#printf("值: 0x%x\n",num);printf("内存布局(低地址->高地址):\n");for(inti=0;i<sizeof(int);i++){printf("地址 %p: 0x%x\n",p+i,*(p+i));}return0;}

在小端机器上输出:

值: 0x12345678 内存布局(低地址->高地址): 地址 0x7ffe...: 0x78 // 最低字节 地址 0x7ffe...: 0x56 地址 0x7ffe...: 0x34 地址 0x7ffe...: 0x12 // 最高字节

2.大端格式 (Big Endian)

  • 高字节存放在低地址
  • 低字节存放在高地址
  • 像PowerPC、网络字节序使用大端
// 假设在大端机器上运行上述代码,输出为::0x12345678内存布局(低地址->高地址):地址0x7ffe...:0x12// 最高字节地址0x7ffe...:0x34地址0x7ffe...:0x56地址0x7ffe...:0x78// 最低字节

二、如何检测大小端

方法1:使用联合体

#include<stdio.h>unionEndianTest{inti;charc[sizeof(int)];};intisLittleEndian(){unionEndianTest test;test.i=1;returntest.c[0]==1;// 如果最低地址字节是1,则是小端}intmain(){if(isLittleEndian()){printf("这是小端机器\n");}else{printf("这是大端机器\n");}return0;}

方法2:使用指针

intisLittleEndian(){intnum=1;return*(char*)&num==1;}

三、字节序转换函数

网络编程中经常需要转换:

#include<arpa/inet.h>// Linux// 或 #include <winsock2.h> // Windowsuint32_thtonl(uint32_thostlong);// 主机->网络(32位)uint16_thtons(uint16_thostshort);// 主机->网络(16位)uint32_tntohl(uint32_tnetlong);// 网络->主机(32位)uint16_tntohs(uint16_tnetshort);// 网络->主机(16位)// 示例:uint32_thost_value=0x12345678;uint32_tnetwork_value=htonl(host_value);// 转换为网络字节序

四、什么情况下使用哪种格式

使用小端格式的情况:

  1. x86/x64架构的CPU(Intel、AMD)
  2. ARM处理器(默认小端,可切换)
  3. Windows/Linux桌面系统
  4. 多数嵌入式系统
  5. 本地数据存储(当不需要跨平台时)

优点:

  • 数学运算方便(从低字节开始处理)
  • 类型转换简单

使用大端格式的情况:

  1. 网络协议(TCP/IP规定使用大端)
  2. PowerPC架构
  3. 某些旧版SPARC、MIPS系统
  4. Java虚拟机内部(大端)
  5. 图像文件格式(如BMP、JPEG)
  6. 某些硬件设备的寄存器

优点:

  • 人类阅读友好(与书写顺序一致)
  • 容易判断数值正负(符号位在最低地址)

五、实际应用示例

示例1:网络数据包解析

#include<stdio.h>#include<stdint.h>// 模拟从网络接收的数据(大端格式)voidparseNetworkPacket(constuint8_t*packet){// 前4字节是大端的IP地址uint32_tip=(packet[0]<<24)|(packet[1]<<16)|(packet[2]<<8)|packet[3];// 使用ntohl转换成本机字节序ip=ntohl(*(uint32_t*)packet);// 更标准的做法printf("IP地址: %u.%u.%u.%u\n",(ip>>24)&0xFF,(ip>>16)&0xFF,(ip>>8)&0xFF,ip&0xFF);}

示例2:文件格式处理

// 读取BMP文件头(大端格式)#pragmapack(push,1)typedefstruct{uint16_tsignature;// "BM",大端uint32_tfileSize;// 大端uint16_treserved1;uint16_treserved2;uint32_tdataOffset;// 大端}BMPHeader;#pragmapack(pop)voidreadBMP(constchar*filename){FILE*file=fopen(filename,"rb");BMPHeader header;fread(&header,sizeof(header),1,file);// 转换字节序header.signature=ntohs(header.signature);header.fileSize=ntohl(header.fileSize);header.dataOffset=ntohl(header.dataOffset);fclose(file);}

六、编写跨平台代码的建议

  1. 使用标准转换函数(htonl/ntohl等)
  2. 避免直接内存拷贝不同字节序的数据
  3. 明确数据格式在文档中说明
  4. 测试时考虑字节序
  5. 使用固定宽度整数类型(uint8_t, uint32_t等)
// 安全的字节序无关的读取uint32_treadUint32BigEndian(constuint8_t*buffer){return(buffer[0]<<24)|(buffer[1]<<16)|(buffer[2]<<8)|buffer[3];}uint32_treadUint32LittleEndian(constuint8_t*buffer){returnbuffer[0]|(buffer[1]<<8)|(buffer[2]<<16)|(buffer[3]<<24);}

总结

  • 小端:低字节在低地址,常见于Intel CPU
  • 大端:高字节在低地址,用于网络和某些硬件
  • 网络通信必须使用大端
  • 本地存储通常使用本机字节序
  • 跨平台开发要注意字节序转换

理解大小端对网络编程、文件格式解析、硬件交互等至关重要!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 22:52:42

计算机毕设Java基于web的共享汽车管理系统 Java Web技术驱动的共享汽车在线管理平台 基于Java Web架构的共享汽车运营管理解决方案

计算机毕设Java基于web的共享汽车管理系统06q4h9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着城市化进程的加快和人们出行需求的多样化&#xff0c;共享汽车作为一种高效…

作者头像 李华
网站建设 2026/7/1 23:37:52

Jellyfin书架插件完整指南:打造专属数字图书馆

Jellyfin书架插件完整指南&#xff1a;打造专属数字图书馆 【免费下载链接】jellyfin-plugin-bookshelf 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-bookshelf 还在为海量电子书和有声读物管理烦恼吗&#xff1f;Jellyfin书架插件是你的完美解决方案…

作者头像 李华
网站建设 2026/7/1 23:38:04

6000元笔记本怎么选:七彩虹将星X16 Pro实测,如何把钱花在刀刃上?

每年的开学季和促销节点&#xff0c;“预算6000元&#xff0c;到底该选什么游戏笔记本&#xff1f;”都会成为数码圈最热门的话题之一。这个价位是众多学生党和初次购机用户的心理关口&#xff0c;既期待强劲性能&#xff0c;又怕陷入“高价低配”或“参数虚标”的陷阱。随着英…

作者头像 李华
网站建设 2026/7/1 23:34:55

离线OCR终极指南:5步掌握本地文字识别的完整技巧

离线OCR终极指南&#xff1a;5步掌握本地文字识别的完整技巧 【免费下载链接】wangfreexx-tianruoocr-cl-paddle 天若ocr开源版本的本地版&#xff0c;采用Chinese-lite和paddleocr识别框架 项目地址: https://gitcode.com/gh_mirrors/wa/wangfreexx-tianruoocr-cl-paddle …

作者头像 李华
网站建设 2026/7/1 20:17:54

CSS Grid生成器终极教程:零基础快速掌握响应式网格布局

CSS Grid生成器终极教程&#xff1a;零基础快速掌握响应式网格布局 【免费下载链接】cssgridgenerator &#x1f9ee; Generate basic CSS Grid code to make dynamic layouts! 项目地址: https://gitcode.com/gh_mirrors/cs/cssgridgenerator &#x1f9ed; 在当今Web开…

作者头像 李华
网站建设 2026/7/1 23:38:49

TwinCAT dump文件存储位置(Core Dump警告处理)

方向Windows 倍福TwinCAT平台 dump文件 (在PC上的存储路径)描述做TwinCAT调试时&#xff0c;错误列表总出现警告A Core Dump created on the 2025-12-01 17:26:31 is available on the device存储位置C&#xff1a;\TwinCAT\3.1\Boot 目录以taskmemory开头&#xff0c;后缀名为…

作者头像 李华