数据的存储

发布时间:2026/10/8 8:36:13

数据的存储 标题目录数据存储整数在内存中的存储存储规则机器码大小端字节序以及其判断浮点数在内存中的存储数据存储整数在内存中的存储存储规则计算机内部使用二进制编码表示整数带符号的整数称为机器数包含符号位和数值位实际数值是真值。符号位数值位0为正1为负数的绝对值机器码整数的二进制表示方法有三种即原码、反码、补码。正整数的原码、反码、补码相同。负整数原码为将数值按照正负数的形式翻译为二进制形式得到的数值码。反码为原码的符号位不变数值位按位取反。补码为反码加一。在计算机中统一采用补码的存储及运算。计算机硬件中只有加法器补码可以将符号位和数值域统一处理减法运算转换为加法运算简化了运算器的设计不需要额外的硬件电路。大小端字节序以及其判断概念如下图所示在vs调试当中我们取地址a,可以发现它是按照字节为单位倒着存储的。那下面我们一起来探讨一下数据在内存中存储顺序的问题。在计算机中内存的编制是由字节组成的一个多字节的数据会占用连续多个字节。按照不同的存储顺序我们分为大端模式和小端模式。大端存储数据的低位字节内容保存在内存的⾼地址处⽽数据的⾼位字节内容保存在内存的低地址处。小端存储数据的低位字节内容保存在内存的低地址处⽽数据的⾼位字节内容保存在内存的⾼地址处。大端字节序常用于网络协议、嵌入式、单片机。小端字节序常用于x86 架构 PC、Windows、Linux日常电脑都是小端。练习1利用大小端字节序的概念设计一个简单的程序判断当前机器的字节序。int check_order() { int i 1; return (*(char*)i); } int main() { int ret check_order(); if (ret 1) { printf(小端\n); } else { printf(大端\n); } return 0; }代码解析定义 int i1,整形为4个字节在二进制编码当中为00 00 00 01高字节为 00 00 00低字节为 01取变量 i 的低地址将其强制转换为char类型只读取1个字节并解引用取出第一个字节的值。主函数判断内存低地址 → 高地址 01 00 00 00返回值为1为小端。高字节 → 低地址 00 00 00 01返回值为0为大端。练习2int main() { char a -1; signed char b -1; unsigned char c -1; printf(%d,%d,%d\n, a, b, c); return 0; }运行结果如下代码解析由于打印格式为%d需要整形提升提升规则有符号数按符号位扩展高位补符号位无符号数高位补0a的原码 10000000 00000000 00000000 00000001反码 111111111 111111111 111111111 111111110补码 111111111 111111111 111111111111111111内存补码为11111111提升后补码为 111111111 111111111 111111111 111111111 真值为-1。同理b打印也为-1。同理c的内存存储为11111111提升后补码为00000000 00000000 00000000 111111111真值为255。练习3int main() { char a -128; printf(%u\n, a); return 0; }%u为无符号数打印形式a为char类型需要整型提升-128 原码 - 10000000 00000000 00000000 10000000 反码 - 11111111 11111111 11111111 01111111 补码 - 11111111 11111111 11111111 10000000 内存存储 - 10000000 整型提升 - 11111111 11111111 11111111 10000000结果如下图所示练习4int main() { char a 128; printf(%u\n, a); return 0; }结果如下图所示练习5#include string.h int main() { char a[1000]; int i; for ( i 0; i 1000; i) { a[i] -1 - i; } printf(%zd, strlen(a)); return 0; }求数组a的字符串长度- 在‘\0’0前的字符串长度-1-i为依次-1的循环模式范围为-1 - -128 - 127- 0结果如下图所示练习6unsigned char i 0; int main() { for(i 0; i 255; i) { printf(hello world\n); } return 0; }代码结果为无限循环。无符号数的取值范围为0~255。如果数值大于255(二进制为11111111)增一为100000000取八位为00000000即返回0。练习7#include Windows.h int main() { unsigned int i; for (i 9; i 0; i--) { printf(%u\n,i); Sleep(1000); } return 0; }代码结果为无限循环。无符号整数的取值范围很大为0-32位的1组成的数。所以 i0 的判断恒成立,程序会无限循环。结果如下图所示练习8int main() { int a[4] { 1,2,3,4 }; int* ptr1 (int*)(a 1); int* ptr2 (int*)((int)a 1); printf(%x,%x\n, ptr1[-1], *ptr2); return 0; }如图所示地址偏移(字节): 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 对应元素: ───── a[0]1 ────┼───── a[1]2 ────┼───── a[2]3 ────┼───── a[3]4 ────┼ 数组外未知内存 字节归属: 0~3号字节 4~7号字节 8~11号字节 12~15号字节 16号及以后ptr1: a 表示数组首元素的地址 a 表示整个数组的地址 a1 表示跳过整个数组 (int*)(a1)即ptr1 解引用表示一个数组的单个元素 ptr1[-1] 即为4偏移: 0 ... 15 16 ↑ ↑ a ptr1 a1 的位置 偏移: 12 13 14 15 | 16 ↑ ↑ a[3]4 ptr1 (ptr1 - 1)ptr2: (int)a 表示将a强制转换为普通整数 (int)a1 纯数值 1只偏移 1 个字节 再强制转回 int*得到 ptr2偏移: 0 1 2 3 ↑ ↑ a ptr2 a[0]首字节 a[0]第2字节结果如下图所示浮点数在内存中的存储基础划分类型总位数符号位 (S)阶码 (E)尾数 (M)float单精度32 bit1 bit8 bit23 bitdouble双精度64 bit1 bit11 bit52 bit内存布局高位 → 低位符号位 S 阶码 E 尾数 M存储规则浮点数在计算机内部的表示方法S表示符号位0为正数1为负数。M表示有效数字区间为1M2。E为指数位。存储过程浮点数存放有效数字M约定二进制浮点数整数部分固定为 1所以可以被舍去只存小数部分写作1.M。这一步叫隐藏整数 1可以节省 1 位空间。指数E规定:E是一个无符号整数。但在科学计数法中,E可以有负数的形式出现。所以当存入内存时指数E需要将原有的真实值加上一个中间数。对于8位的E,取值范围为0-255中间数位127。对于11位的E,取值范围为0-2047中间数位1023。浮点数取值规格化浮点数E不为全0或不为全1指数E的计算值减去127或1023得到真实值再将有效数字M前加上第⼀位的1。非规格化浮点数E为全0将隐藏的整数 1 取消小数变为 0.M。表⽰±0以及接近于0的很小的数字。E为全1如果有效数字M全为0表⽰±无穷⼤正负取决于符号位s。
延伸阅读

更多相关文章

2026/10/7 6:34:16

C# Modbus插件化架构:10分钟构建可配置的工业数据采集系统

如果你正在用 C# 开发工业自动化上位机或数据采集系统,并且厌倦了每次对接新设备都要重写一遍 Modbus 通信代码,那么这篇文章就是为你准备的。今天要介绍的不是一个具体的开源项目,而是一个基于 C# 快速构建 Modbus 插件系统的核心思路与实现…

2026/10/8 8:33:21

C++ 实现读写锁的代码详解

前言读写锁(reader-writer lock)要解决的是一类很常见的并发矛盾:共享数据被读的次数远远多于 被写的次数。用普通的 std::mutex,两个读者明明互不干扰,却必须排队,白白浪费了并行度; 而用读写锁…

2026/10/8 8:33:21

UIUC CS241系统编程中文讲义:从进程线程到内存同步的实战指南

简介:面向系统编程学习者的UIUC CS241中文讲义翻译项目,基于美国伊利诺伊大学厄巴纳-香槟分校经典课程整理而成,适合需要系统理解进程、线程、虚拟内存、同步与并发等底层机制的开发者参考。该资源为ApacheCN开源社区维护的校对版&#xff0c…

2026/10/8 8:33:21

DLL修复工具免费版靠不住?系统命令+运行库才是根本

简介:这款DLL修复工具面向因系统动态链接库缺失或损坏而导致软件无法运行的普通用户与维护人员,能够自动扫描并一键修复常见DLL错误,适用于游戏启动失败、办公软件报错等典型场景。压缩包共192个文件,约99.32MB,核心包…

2026/10/8 8:33:21

阿里云短信接口Demo全解析:从调用链路到生产落地

简介:这份压缩包定位为阿里云短信服务在PHP环境中的集成示例,面向需要快速接入短信验证码、系统通知或营销消息的网站开发者。压缩包整体大小约三点三五兆字节,内含阿里云官方短信服务的PHP开发包调用示例,完整演示了从配置访问密…

2026/10/8 8:33:21

Linux服务器RAR工具部署与命令行实战指南

简介:这是一款面向Linux 64位(x86_64)系统的RAR压缩工具测试版,对应版本6.1.b1,主要解决在纯命令行环境中创建、解压、修复RAR档案的需求,适合系统管理员、运维工程师以及经常处理跨平台压缩包的开发者。包…

2026/10/8 8:28:20

QuickBlue:AI应用工程化底座的实践与演进

1. QuickBlue 不是另一个“AI平台”,而是一套被低估的工程化底盘QuickBlue 这个名字刚出现在我视野里时,我下意识点开几个技术社区帖子,发现多数讨论都卡在“它是不是又一个大模型封装壳”上——这恰恰暴露了当前企业落地AI最深的误区&#x…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/7 8:18:33

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 0:02:17

自然数立方等于连续奇数之和:从证明到编程验证

十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等…

2026/10/8 0:02:17

C#上位机SSH连接实战:用SSH.NET补齐超时、批量与密钥认证

简介:这是一份基于 C# 开发的 SSH 连接功能半成品工程,原本作为另一个主项目的子功能模块,现独立打包分享。工程采用 WinForms 界面,包含源码、解决方案、安装部署工程、NuGet 依赖包及说明文档,适合正在做远程连接、网…

2026/10/8 0:02:17

Java SpringBoot一体化智能售后系统设计与实现全解析

毕业设计年年做,Java Web 方向的题目翻来覆去就那么几个,但“一体化智能售后系统”这个题,每次看到我都觉得值得认真聊一聊。它不是一个简单 curd 堆出来的管理系统,而是把客户、工单、派单、处理、回访、统计整条链路串起来的一套…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑