数据的存储
标题目录数据存储整数在内存中的存储存储规则机器码大小端字节序以及其判断浮点数在内存中的存储数据存储整数在内存中的存储存储规则计算机内部使用二进制编码表示整数带符号的整数称为机器数包含符号位和数值位实际数值是真值。符号位数值位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。

相关新闻

【LeetCode算法题精讲】DP进阶——背包问题入门

【LeetCode算法题精讲】DP进阶——背包问题入门

知识梯度:浅(背包问题概念)→ 浅中(0-1 背包二维 DP)→ 中(滚动数组优化)→ 中深(416 分割等和子集)→ 深(完全背包→322 零钱兑换)→ 升华&#…

2026/10/28 12:41:10 阅读更多 →
快速上手AI瞄准辅助:YOLOv5自动瞄准部署与调优全攻略

快速上手AI瞄准辅助:YOLOv5自动瞄准部署与调优全攻略

快速上手AI瞄准辅助:YOLOv5自动瞄准部署与调优全攻略 【免费下载链接】AI-Aimbot Worlds Best AI Aimbot - CS2, Valorant, Fortnite, APEX, every game 项目地址: https://gitcode.com/gh_mirrors/ai/AI-Aimbot 想象一下这样的场景:在 CS2 或 Va…

2026/11/2 22:58:35 阅读更多 →
抖音直播下载到底卡在哪一步?5 分钟拆解一个免费开源工具

抖音直播下载到底卡在哪一步?5 分钟拆解一个免费开源工具

抖音直播下载到底卡在哪一步?5 分钟拆解一个免费开源工具 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…

2026/10/29 1:13:49 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/3 1:09:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/3 10:57:27 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/3 11:35:49 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/3 2:27:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/3 10:47:27 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/3 10:57:33 阅读更多 →

日新闻

周新闻

月新闻