初识C语言(数据在内存中的存储) - 实践

news/2026/1/17 10:37:46/文章来源:https://www.cnblogs.com/gccbuaa/p/19495329

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
    • 这篇博客主要围绕整数、大小端字节序、浮点数在内存中的存储。
  • 一、整数在内存中的存储
    • 1. 二进制表示形式
    • 2. 存储方式
    • 3. 常见整数类型
    • 4. 特殊整数处理
    • 5. 内存布局示例
  • 二、⼤⼩端字节序和字节序判断
    • 1. 什么是字节序
    • 2. 为什么需要关注字节序
    • 3. 判断当前系统的字节序
      • 方法1:使用C程序判断
      • 方法2:使用Python判断
      • 方法3:使用命令行工具(Linux)
    • 4. 字节序转换函数
      • C语言中的转换函数
      • Python中的转换
      • 手动实现字节序转换
    • 5. 实际应用示例
      • 网络协议处理
      • 文件格式处理
      • 嵌入式开发
    • 6. 常见问题与解决方案
  • 三、浮点数在内存中的存储
    • 1. IEEE 754标准
    • 2. 存储结构详解
      • 符号位(Sign)
      • 指数部分(Exponent)
      • 尾数部分(Mantissa/Significand)
    • 3. 特殊值表示
    • 4. 舍入规则
    • 5. 精度问题
    • 6. 实际应用注意事项
  • 总结


前言

这篇博客主要围绕整数、大小端字节序、浮点数在内存中的存储。

一、整数在内存中的存储

1. 二进制表示形式

整数在计算机内存中是以二进制形式存储的,使用补码表示法。补码系统有以下特点:

例如,8位整数:

2. 存储方式

整数在内存中的存储遵循以下规则:

  1. 大小端存储

    • 大端模式(Big-endian):高位字节存储在低地址
    • 小端模式(Little-endian):低位字节存储在低地址
    • 例如0x12345678在内存中的存储:
      • 大端:12 34 56 78
      • 小端:78 56 34 12
  2. 对齐方式

    • 现代CPU通常要求数据按照其字长对齐
    • 32位系统通常要求4字节对齐
    • 64位系统通常要求8字节对齐

3. 常见整数类型

不同编程语言中的整数类型及其典型存储大小:

类型C/C++JavaPython存储大小
有符号8位charbyteint1字节
无符号8位unsigned char--1字节
有符号16位shortshortint2字节
无符号16位unsigned shortchar-2字节
有符号32位intintint4字节
无符号32位unsigned int--4字节
有符号64位long longlongint8字节
无符号64位unsigned long long--8字节

注意:Python的int类型会自动扩展以适应大整数,实际存储大小会动态变化。

4. 特殊整数处理

  1. 零的表示

  2. 最小负数的表示

  3. 溢出处理

5. 内存布局示例

32位整数0xAABBCCDD在小端系统中的内存布局:

地址   内容
0x1000 DD
0x1001 CC
0x1002 BB
0x1003 AA

理解整数在内存中的存储方式对于以下场景很重要:

  • 网络协议开发(处理字节序)
  • 二进制文件解析
  • 内存敏感型应用开发
  • 跨平台数据交换

二、⼤⼩端字节序和字节序判断

1. 什么是字节序

字节序(Endianness)指的是多字节数据在计算机内存中的存储顺序。主要有两种类型:

  1. 大端字节序(Big-Endian)

  2. 小端字节序(Little-Endian)

2. 为什么需要关注字节序

字节序问题主要在以下场景中需要注意:

  1. 跨平台数据传输

    • 网络通信(网络协议通常采用大端序)
    • 文件格式交换
    • 不同架构设备间的数据共享
  2. 二进制数据处理

    • 解析网络数据包
    • 读取二进制文件
    • 处理硬件寄存器
  3. 调试和逆向工程

    • 分析内存数据时需要知道字节序
    • 理解寄存器和内存中的值对应关系

3. 判断当前系统的字节序

方法1:使用C程序判断

#include <stdio.h>int main() {unsigned int num = 0x12345678;unsigned char *p = (unsigned char *)&num;if (*p == 0x12) {printf("Big-Endian\n");} else if (*p == 0x78) {printf("Little-Endian\n");} else {printf("Unknown Endianness\n");}return 0;}

方法2:使用Python判断

import sys
if sys.byteorder == 'little':
print("Little-Endian")
else:
print("Big-Endian")

方法3:使用命令行工具(Linux)

lscpu | grep "Endian"
# 或
echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6
# 输出1表示小端,0表示大端

4. 字节序转换函数

C语言中的转换函数

#include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);  // 主机到网络(32位)uint16_t htons(uint16_t hostshort); // 主机到网络(16位)uint32_t ntohl(uint32_t netlong);   // 网络到主机(32位)uint16_t ntohs(uint16_t netshort);  // 网络到主机(16位)

Python中的转换

import socket
value = 0x12345678
network_order = socket.htonl(value)  # 主机序转网络序
host_order = socket.ntohl(network_order)  # 网络序转主机序

手动实现字节序转换

32位整数的转换示例:

uint32_t swap_endian(uint32_t val) {
return ((val << 24) & 0xff000000) |
((val << 8)  & 0x00ff0000) |
((val >> 8)  & 0x0000ff00) |
((val >> 24) & 0x000000ff);
}

5. 实际应用示例

网络协议处理

处理TCP/IP首部时需要注意:

文件格式处理

常见二进制文件的字节序:

  • PNG:大端序
  • GIF:小端序
  • JPEG:大端序
  • ELF:与目标平台相关

嵌入式开发

访问硬件寄存器时需要特别注意:

6. 常见问题与解决方案

  1. 数据错位问题

    • 现象:接收到的数据与预期不符
    • 解决方案:检查发送方和接收方的字节序是否一致
  2. 跨平台兼容性

    • 使用标准网络字节序(大端)进行数据交换
    • 在文件头中加入字节序标识
  3. 性能考虑

    • 在已知字节序的系统中避免不必要的转换
    • 批量转换优于逐个转换
  4. 调试技巧

    • 使用十六进制查看器检查原始数据
    • 打印内存内容对比预期值

三、浮点数在内存中的存储

1. IEEE 754标准

浮点数在内存中的存储遵循IEEE 754标准,该标准定义了浮点数的二进制表示格式。主要有两种格式:

  • 单精度浮点数(32位):

    • 1位符号位
    • 8位指数位
    • 23位尾数位
  • 双精度浮点数(64位):

    • 1位符号位
    • 11位指数位
    • 52位尾数位

2. 存储结构详解

符号位(Sign)

  • 位于最高位
  • 0表示正数,1表示负数
  • 示例:-3.14的符号位为1

指数部分(Exponent)

尾数部分(Mantissa/Significand)

  • 采用隐含最高位1的表示方法(规范化数)
  • 只存储小数部分
  • 示例:1.1011只需存储1011

3. 特殊值表示

IEEE 754标准还定义了特殊值的表示:

4. 舍入规则

IEEE 754定义了四种舍入模式:

  1. 向最近值舍入(默认)
  2. 向零舍入
  3. 向正无穷舍入
  4. 向负无穷舍入

5. 精度问题

由于浮点数的二进制表示特性,会导致一些十进制小数无法精确表示,如:

6. 实际应用注意事项

在编程中需要注意:

  1. 避免直接比较浮点数相等

    • 应该比较两者差值是否小于某个极小值(如1e-6)
  2. 注意累积误差

    • 多次运算可能导致误差累积
  3. 选择合适的浮点类型

    • 根据精度需求选择单精度或双精度
  4. 注意特殊值的处理

    • 检查NaN和无穷大的情况

总结

以上就是本文总结的内容,关于数据在内存中的存储。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1173049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026年无缝钢管推荐:基于行业合作网络的供应商评价与排名评测 - 十大品牌推荐

摘要 在工业制造、能源化工及基础设施建设领域,无缝钢管作为关键的基础材料,其供应链的稳定性与产品质量的可靠性直接关系到下游项目的安全与成本。当前,采购决策者普遍面临的核心挑战在于,如何在众多供应商中精准…

海尔洗衣机全球17连冠:从产品到智慧场景的升级

1月8日&#xff0c;一份来自世界权威调研机构欧睿国际的数据&#xff0c;再次明确了洗衣机行业的全球座次&#xff1a;2025年&#xff0c;海尔洗衣机品牌零售量全球第一。这也是其第17次蝉联全球第一&#xff0c;全球市场份额更是实现了罕见的“9连涨”。在国内市场&#xff0c…

一文搞定 MediaPipe:零基础搭建到核心功能开发的完整教程

文章目录 MediaPipe 教程:从安装到应用 引言 1. MediaPipe 安装 1.1 环境要求 1.2 安装 MediaPipe 2. 人体姿态检测 2.1 概述 2.2 基本代码实现 2.2.1 导入必要的库 2.2.2 初始化 MediaPipe 姿态检测 2.2.3 视频捕获和处理 2.3 模块化开发 2.3.1 定义 `poseDetector` 类 2.3.2…

2026年无缝钢管推荐:基于行业合作深度评价的供应商排名与综合评测 - 十大品牌推荐

摘要 在工业制造、能源建设和基础设施领域,无缝钢管作为关键的基础材料,其供应链的稳定性与产品质量的可靠性直接关系到下游项目的成败与安全。当前,采购决策者面临的核心挑战在于,如何在供应商数量众多、产品标准…

8.3 AI员工性能优化:提升处理效率与准确性

8.3 AI员工性能优化:提升处理效率与准确性 在构建了超级AI员工和多Agent协同系统之后,如何优化这些AI员工的性能成为提升整体系统效能的关键。性能优化不仅关乎处理速度,还包括准确性、资源利用率、可扩展性等多个维度。本节将深入探讨AI员工性能优化的各种策略和技术,帮助…

云浮市云城云安新兴郁南罗定区英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 老周说教育

经教育部教育考试院认证、全国雅思教学质量监测中心联合指导,参照《2024-2025中国大陆雅思成绩大数据报告》核心标准,结合云浮市云城区、云安区、新兴县、郁南县、罗定市3200份考生调研问卷、48家教育机构全维度实测…

jumpserver-使用

步骤一:系统需求操作系统操作系统 架构 Linux 内核 软件要求 最小化硬件配置 linux/amd64 x86_64 >= 4.0 wget curl tar gettext iptables python 2Core/8GB RAM/60G HDD linux/arm64 aarch64 >= 4.0 curl tar …

外呼系统是怎么操作使用?

作为电销经验10余年的人来说&#xff0c;总结一点外呼系统使用真的很简单&#xff0c;就是有手就会&#xff0c;结合现在软件的功能&#xff0c;已经变成了一件趁手的拓客工具简单来说外呼系统分为以下两种情况第一种是公司自己有销售人员&#xff0c;用于业务开发&#xff0c;…

基于SpringBoot的小学生身体素质测评管理系统(11720)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

2026年产品设计公司选购看什么?这份深度评测与口碑排名推荐给你答案 - 十大品牌推荐

摘要 在数字化与体验经济深度融合的当下,产品设计已从单一的外观优化,演变为驱动品牌差异化、提升用户忠诚度与实现商业增长的核心战略职能。企业决策者,尤其是寻求产品创新与市场突破的品牌负责人,正面临一个关键…

SGMICRO圣邦微 SGM8274XS14G/TR SOP14 运算放大器

特性 .轨到轨输出 .宽输入共模电压范围 .低偏置电压:3mv(最大值) .低输入偏置电流.低输入失调电流 低静态电流:150pA/放大器 .输出短路保护 .高输入阻抗 .高斜率:7V/us.小型封装: SGM8271提供绿色SOT-23-5、MSOP-8和SOIC-8封装 SGM8272提供绿色MSOP-8和SOIC-8封装封装 SGM8274采…

2026年外观设计公司选购应关注什么?这份深度评价与推荐排名提供答案 - 十大品牌推荐

摘要 在消费升级与产业创新的双重驱动下,产品的外观设计已成为企业构建差异化竞争优势、传递品牌价值的关键战略环节。对于寻求产品力突破的企业决策者而言,面对市场上数量众多、风格各异的设计服务机构,如何甄别其…

2026年外观设计公司推荐:聚焦口碑对比的深度评价及最终排名解析 - 十大品牌推荐

摘要 在当今商业环境中,产品的外观设计已成为塑造品牌形象、提升用户体验和驱动市场增长的关键战略要素。面对日益激烈的市场竞争,企业决策者,尤其是产品经理、品牌负责人及创业者,常常陷入选择困境:如何在众多设…

2026年产品设计公司推荐:基于权威机构评定的TOP5排名与深度评测 - 十大品牌推荐

摘要 在数字化与体验经济深度融合的当下,产品设计已从单一的外观塑造,演变为驱动品牌差异化与商业增长的核心战略环节。企业决策者,尤其是寻求产品创新与市场突破的品牌负责人,正面临一个关键抉择:如何在众多设计…

2026亲测!有机肥好厂口碑推荐分享

有机肥哪家好&#xff1a;专业深度测评 | 排名前五品牌实测分析开篇&#xff1a;定下基调随着生态农业的快速发展&#xff0c;有机肥因其改良土壤、提升作物品质、减少污染等优势&#xff0c;逐渐成为种植户的首选。然而&#xff0c;市场品牌众多&#xff0c;质量参差不齐&…

[C++][cmake]基于C++在windows上onnxruntime+opencv部署yolo26的图像分类onnx模型

如果只需要opencv去部署yolov11分类模型可以参考我其他博文&#xff0c;本文和 opencv去部署yolov11分类模型区别是&#xff1a;opencv部署推理核心使用opencv自带api&#xff0c;而本文推理核心用的onnxruntime&#xff0c;opencv只是辅助作用即读取处理图片【算法介绍】ONNX …

吐血推荐10个AI论文写作软件,本科生毕业论文轻松搞定!

吐血推荐10个AI论文写作软件&#xff0c;本科生毕业论文轻松搞定&#xff01; AI 工具如何让论文写作变得轻松&#xff1f; 在当今学术环境中&#xff0c;越来越多的本科生开始借助 AI 工具来提升论文写作效率。尤其是面对繁重的论文任务时&#xff0c;这些工具不仅能帮助学生快…

面向边缘设备的YOLOv12模型轻量化:剪枝与知识蒸馏联合优化方法

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有! 文章目录 **面向边缘计算的YOLOv12模型剪枝-蒸馏联合优化实战教程** **一、 核心原理解析:从“庞大笨重”到“精干高效”的蜕变** **二、 代码实现:一步步完成模型…

如何选择产品设计合作伙伴?2026年最新深度评测与综合排名推荐 - 十大品牌推荐

摘要 在数字化与体验经济深度融合的当下,产品设计已从单一的外观美化,演进为驱动商业创新、构建品牌差异化的核心战略环节。无论是寻求产品突破的成熟企业,还是意图从零打造爆款的新兴品牌,在选择设计合作伙伴时都…

收集自己的每日消费金额,统计每周消费峰值,输出消费高峰日,并给出省钱建议。

完整输出一个可运行的 Python 项目示例&#xff0c;用于记录每日消费、统计每周消费峰值、输出消费高峰日并给出省钱建议。1. 实际应用场景描述在日常生活中&#xff0c;很多人习惯用手机支付或现金消费&#xff0c;但往往缺乏对消费数据的系统化管理。例如&#xff1a;- 月底发…