当前位置: 首页 > ai >正文

数据的存储

数据在内存中的存储探秘​

一.引言

在计算机的世界里,数据的存储是一切运算和操作的基础。数据以二进制的形式存储在内存中,而不同类型的数据,其存储方式也各有特点。接下来,我们将深入探究整数、字符和浮点型数据在内存中的存储奥秘。​

二、整数的存储​

整数的二进制表示形式有原码、反码和补码三种。原码是直接根据数值写出的二进制序列;反码是在原码的基础上,符号位不变,其他位取反;补码则是反码加一。在二进制中,最高位为 1 表示负数,为 0 表示正数。对于正整数,原码、反码和补码是相同的 。而在内存中,整数是以补码的形式存储的,这是因为计算机内部没有减法运算,只有加法运算,补码与原码转化的算法相同,使用补码存储整数不需要额外的电路,大大简化了计算机的运算逻辑。​

在内存中,数据的存储还涉及到字节序的问题,即顺序存储的方式,分为大端字节序和小端字节序。大端字节序是将低位字节序放在高地址,高位字节序放在低地址;小端字节序则是将低位字节序放在低地址,高位字节序放在高地址。我们可以通过一段简单的 C 语言代码来判断机器是大端存储还是小端存储:​

#include <stdio.h>
int main() {​int i = 1;​char* p = (char*) & i;​if (1 == *p) {​printf("小端存储\n");​}​else​printf("大端存储\n");​return 0;​}​​

这段代码利用指针将整数i的地址强制转换为字符指针,通过访问字符指针指向的第一个字节来判断存储方式。如果该字节的值为 1,则说明是小端存储,因为小端存储时低位字节在低地址,整数 1 的最低位字节就是 1;反之则为大端存储。​

三、字符型的存储​

字符型数据char在内存中的存储同样遵循一定的规则。char类型是有符号的,其取值范围是[-128, 127] 。当我们使用%u格式符打印char类型数据时,由于%u表示无符号整数,此时左边第一位不再是符号位,而是作为数值的一部分参与打印。

#include <Stdio.h>
int main() {​char a[1000];​int i = 0;​for (i = 0; i < 1000; i++) {​a[i] = -1 - i;​}​printf("%d ", strlen(a));​return 0;​}​​

在这个循环中,不断给字符数组a赋值,由于char类型的取值范围限制,strlen最后会取值到255

三、浮点型的存储​

浮点型数据的存储与整数有很大区别,它遵循 IEEE 754 标准。任意一个二进制的浮点数都可以表示成(-1)^S * M * 2^E的形式 。

其中,(-1)^S表示符号位,当S = 0时,浮点数为正数;当S = 1时,浮点数为负数。

M表示有效数字,其范围是大于 1 小于 2。

2^E表示指数位。​

对于float类型,它在内存中的存储分为三个部分:1 位符号位S、8 位指数位E和 23 位有效数字位M;double类型则是 1 位符号位S、11 位指数位E和 52 位有效数字位M 。需要注意的是,因为1 <= M < 2,即M可以写成1.xxxx的形式,其中整数部分的 1 是固定的,所以在存储时 1 不存进内存,只保留小数位。

另外,E为无符号数,对于 8 位的E,其范围是 0 - 255;对于 11 位的E,范围是 0 - 2047。但在科学计数法中E可以出现负数,所以存入内存中的E真实值必须加上一个中间数,对于 8 位E,中间数为 127;对于 11 位E,中间数为 1023。​

通过下面这段 C 语言代码,我们可以直观地感受到浮点数和整数在内存存储视角上的差异:​

#include <stdio.h>
int main() {​int n = 9;​float* pFloat = (float*)&n;​printf("n的值为:%d\n", n);​printf("pFloat的值为:%f\n", *pFloat);​*pFloat = 9.0;​printf("n的值为:%d\n", n);​printf("pFloat的值为:%f\n", *pFloat);​return 0;​}​​

在这段代码中,首先将整数9的地址强制转换为浮点数指针,然后分别以整数和浮点数的视角打印该地址存储的值,会发现结果完全不同,这充分说明了浮点数和整数在内存中的存储方式和解读方式存在差异。当将浮点数9.0存储到该地址后,再次以整数和浮点数视角打印,结果也会相应改变,进一步验证了两种数据类型存储和解读的独特性。

四.总结​

深入理解数据在内存中的存储方式,对于编写高效、准确的程序至关重要。无论是整数、字符还是浮点型数据,它们各自的存储规则都体现了计算机科学的精妙之处,为我们在编程过程中处理数据提供了坚实的理论基础。​

http://www.xdnf.cn/news/3656.html

相关文章:

  • Python表达式全解析:从基础到高级
  • 开源项目实战学习之YOLO11:ultralytics-cfg-models-nas(十)
  • C++的内存
  • 深入探索 AAC 编码原理与 ADTS 格式:音频世界的智慧结晶
  • PCIe | TLP 报头 / 包格式 / 地址转换 / 配置空间 / 寄存器 / 配置类型
  • 第二章:一致性基础 A Primer on Memory Consistency and Cache Coherence - 2nd Edition
  • 线程互斥与同步(上)
  • 2025年渗透测试面试题总结-拷打题库36(题目+回答)
  • Python Cookbook-6.18 用__init__参数自动初始化实例变量
  • 多端定制系统开发:打造高效全平台覆盖的APP解决方案
  • Python爬虫(16)Python爬虫数据存储新维度:Redis Edge近端计算赋能实时数据处理革命
  • phpyun人才系统v7.0升级v7.1 开源vip版,php云专业人才招聘系统小程序零工市场源码支持v4.6的更新步骤流程详解
  • 工作记录 2015-07-15
  • 数据结构的基本概念以及算法的基本内容
  • python:如何获取股票 周K线数据、月K线数据
  • Go语言入门基础:协程
  • 【信息系统项目管理师-论文真题】2012上半年论文详解(包括解题思路和写作要点)
  • 装饰器@wraps(func)详解
  • 伊甸园之东: 农业革命与暴力的复杂性
  • Learning vtkjs之Cutter
  • 有向图强连通分量好题分享(一)
  • 【深度学习的灵魂】图片布局生成模型LayoutPrompt(2)·布局序列化模块
  • 如何通过文理工三类AI助理赋能HI,从而,颠覆“隔行如隔山”的旧观念和“十万小时定律”的成长限制
  • 快速掌握--cursor
  • 深入解析 Stacking:集成学习的“超级英雄联盟
  • 排查 EF 保存数据时提示:Validation failed for one or more entities 的问题
  • 以梦为舟,共赴中医星辰大海
  • 【Mytais系列】Type模块:源码
  • MySQL快速入门篇---数据库约束
  • 【计算机视觉】三维重建: MVSNet:基于深度学习的多视图立体视觉重建框架