C/C++数据在内存中的存储方式
在学习C/C++编程语言时,免不了和内存打交道,在计算机中,我们存储有电影,文档,音乐等数据,这些数据在内存中是以什么形式存储的呢?下面做一下简单介绍。
本文是学习VIPler的博文关于内存地址和内存空间的理解之后整理的,感谢VIPler提供学习资源。
1 内存地址
我们经常在书上或者网络上看到4位和8位的内存地址表示方法,比如0x0001或者0x00000001,为什么会有这两种区别呢?
其实,这两种表示方法都是表示的编号为1的内存地址,都只是一个地址编号,指向(或者说)一个1字节的内存空间。
注意一点:
计算机存储器的内存是以字节为基本单位,也即一个地址代表1个字节(8bit)的存储空间。
比如如下表示:
[0x0000]------>[8bit空间]
[0x0001]------>[8bit空间]
[0x0002]------>[8bit空间]
[0x0003]------>[8bit空间]
或者
[0x00000000]------>[8bit空间]
[0x00000001]------>[8bit空间]
[0x00000002]------>[8bit空间]
[0x00000003]------>[8bit空间]
至于为什么会出现4位16进制地址0x0001和8位16进制地址0x00000001,是因为硬件所支持的寻址空间不同,有些CPU只能寻址16位(16根地址线),所以用4位十六进制表示地址就够用了。有些CPU只能寻址32位(32根地址线),所以用8位十六进制。
2 内存空间
在计算机数据存储中,无论是代码还是数据,都会存储在硬盘中,掉电不会丢失。硬盘容量大,但是数据传输速度较慢,与CPU的运行速度不匹配,所以在运行程序或打开数据时,首先会把数据从硬盘等存储器上拷贝到数据传输速率较快的存储器上,然后再送到CPU进行处理,这个中间存储器就是内存。
(这就是为什么电脑开的进程多了,会卡,我们会想到换一个大一点的内存条。再卡就换固态硬盘。)
内存也是一种存储器,也会有地址,这个地址就相当于家里的门牌号。
计算机把存储在存储器上的所有信息都数字化了,因为在计算机存储中都是0和1的二进制。
下面通过两个例子进行说明:
(1) 存储汉字 “丁”,如下图:

汉字在存储中占两个字节。计算机记住“丁”字的内存地址是0x1000(1000H)。其他的汉字也是类似的存储。
第一行,是汉字本身,给人看的,
第二行,是计算机在存储器中存储“丁”字的真正存储内容,0001001001110101在计算机中就代表“丁”字
第三行,是“丁”字在计算机中的内存地址
对于上面可以这样理解,内存地址相当于一个门牌号。一个门牌号对应的家里有卧室,厨房,卫生间,客厅等不同房间,这些就相当于一个内存地址对应的8bit内存空间。
只有门牌号有编号,一家一个,家里的卧室等房间是没有编号的(也即没有内存地址)。
翻译过来就是:一个内存地址对应一小块内存,这块内存存储8bit数据。
(2)汉字占两个字节,英文字母和阿拉伯数字占一个字节,以"A"为例

理解方法与“丁”字类似。
总结内存地址是内存中存储数据的一个标识,并不是数据本身,通过内存地址可以访问到对应内存中存储的数据。
C/C++数据在内存中的存储方式的更多相关文章
- 数据在内存中的存储方式( Big Endian和Little Endian的区别 )(x86系列则采用little endian方式存储数据)
https://www.cnblogs.com/renyuan/archive/2013/05/26/3099766.html 1.故事的起源 “endian”这个词出自<格列佛游记>.小 ...
- C语言 float、double数据在内存中的存储方式
float在内存中占4个字节(32bit),32bit=符号位(1bit)+指数位(8bit)+底数位(23bit) 指数部分 指数位占8bit,可以表示数值的范围是0-(表示0~255一共256个数 ...
- C语言之数据在内存中的存储
C语言之数据在内存中的存储 在我们学习此之前,我们先来回忆一下C语言中都有哪些数据类型呢? 首先我们来看看C语言中的基本的内置类型: char //字符数据类型 short //短整型 int //整 ...
- <转载>浅谈C/C++的浮点数在内存中的存储方式
C/C++浮点数在内存中的存储方式 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100.则在Intel CPU架构的系统中 ...
- C语言中浮点数在内存中的存储方式
关于多字节数据类型在内存中的存储问题 //////////////////////////////////////////////////////////////// int ,short 各自是4. ...
- QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度复制)非常实用
FROM:http://apps.hi.baidu.com/share/detail/33517814 今天做项目时,需要用到QList来存储一组点.为此,我对QList类的说明进行了如下翻译. QL ...
- Float在内存中的存储方式及IEC61131处理
Float在内存中的存储方式及IEC61131处理 1,fp32(32bits float)类型数据在存储器中占用4Bytes存储,且遵循IEEE-754标准: 一个浮点数分三部分组成: 符号位s(1 ...
- float数据在内存中的存储方法
浮点型变量在计算机内存中占用4字节(Byte),即32-bit.遵循IEEE-754格式标准.一个浮点数由2部分组成:底数m 和 指数e. ±mant ...
- JavaScript 之 数据在内存中的存储和引用
栈和堆 大家都知道,JS中的数据类型包括两种:简单数据类型(String.Number.Boolean.undefined.null)和复杂数据类型(object). 在内存中分为栈区(stack)和 ...
随机推荐
- EF Core 2.2 对多个 DbContext 单个数据库的情况进行迁移的示例
目录 场景 创建新项目 创建第一个模型 创建第二个模型 使用依赖注入注册上下文 创建数据库 需要注意的情况 场景 在一个项目中,使用了多个 DbContext 且使用同一个数据库的情况 创建新项目 打 ...
- 使用With递归查询 树
UNION ALL -- 递归成员 SELECT a.* FROM tree a JOIN CTE c ON a.pid = c.id ) SELECT * from CTE --1.将 CTE ...
- navicat连接centos7上mysql:2003-Can't connect to MySQL server (10060)
问题解决步骤: 1.参考http://jingyan.baidu.com/article/95c9d20dac9040ec4f75617a.html,发现是防火墙未关闭: 2.关闭并禁止firewal ...
- 大数据ssh疑点跟踪
相信运维的对ssh免密登陆应该是对这个再清楚不过的吧,由于我们大数据对于安全这方便管控的很严格,单独找一台物理机作为跳板机,其他的机器都必须要从这个跳板机免密登陆,由于机器比较的多,其中dn30这个域 ...
- react生命周期,中间件、性能优化、数据传递、mixin的使用
https://github.com/lulujianglab/blog/issues/34 一.生命周期 1,初始化的执行顺序,初始生命周期执行过程详解 class initSate extends ...
- shell 命令 使用
[root@ken ~]# cat ken.sh http://www.baidu.com http://www.baidu.com http://www.sina.com http://www.si ...
- 二、OpenStack—keystone组件介绍与安装
一.Keystone介绍 keystone 是OpenStack的组件之一,用于为OpenStack家族中的其它组件成员提供统一的认证服务,包括身份验证.令牌的发放和校验.服务列表.用户权限的定义等等 ...
- Vue使用过程中常见问题
目录 一.vue监听不到state数组/json对象内的元素的值的变化,要手动通知触发 二.vue用splice删除多维数组元素导致视图更新失败情况 三.vue项目如何部署到php或者java环境的服 ...
- OO Unit 1 表达式求导
OO Unit 1 表达式求导 面向对象学习小结 前言 本博主要内容目录: 基于度量来分析⾃己的程序结构 缺点反思 重构想法 关于BUG 自己程序出现过的BUG 分析⾃己发现别人程序bug所采⽤的策略 ...
- PCB铺铜
问:为何要铺铜?答:一般铺铜有几个方面原因.1.EMC.对于大面积的地或电源铺铜,会起到屏蔽作用,有些特殊地,如PGND起到防护作用.2.PCB工艺要求.一般为了保证电镀效果,或者层压不变形,对于布线 ...