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)和 ...
随机推荐
- 搭建 eclipse,maven,tomcat 环境
1,安装jdk 2,安装eclipse,可以写java程序 3,安装tomcat,可以写简单的web页面 4,安装maven,再eclipse中可以构建maven管理的java程序 5,将maven程 ...
- 558. Quad Tree Intersection
https://leetcode.com/problems/quad-tree-intersection/description/ 我觉得是用意挺好的一题目.求两个四叉树的逻辑union,可惜测试用例 ...
- 基于SSL实现Mysql加密主从
Mysql主从复制是明文传输的,对于一些特殊的场合是绝对不允许的,数据的安全性会受到威胁,在这里,简单的构建基于SSL的mysql主从复制 Ps:这里采用master-mysql为CA服务器 主端生成 ...
- 数组实现int随机数的阶乘(避免大数问题)
面试的一道题目,实现int随机数的阶乘.这道题就是考察你考没考虑大数问题,如何避免它. 我能想到的就是用数组去实现,然后写了一下代码.但是当i的值很大,接近Max_value时的情况还没有考虑到. 直 ...
- jdk1.8安装
jdk1.8:链接: https://pan.baidu.com/s/1Orv7Rjz0jkprcdoRSFWiPw 提取码: rn73 设置jdk和jre文件位置 配置环境变量: 系统变量中jdk ...
- xxl-job调度中心配置以及常见错误
项目结构图 启动步骤: 1.检查 /xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties 下的JDBC链接.登录账号. 2 ...
- C++ Json解析CJsonObject的详细使用
引用头文件: #include <string> #include <iostream> #include <fstream> #include <casse ...
- codeforces contest1082
C 维护前缀和 题意 每一个id给一个权值序列,从每个id选出数量相同的权值,对他们进行求和,使得他们的和最大 题解 注意负数对结果没有贡献,直接跳过. 当时写的比较挫,连排序都写错了!cf的编译器比 ...
- 2019-3-22c# TextBox只允许输入数字,禁用右键粘贴,允许Ctrl+v粘贴数字
TextBox 禁止复制粘贴 ShortcutsEnabled =false TextBox只允许输入数字,最大长度为10 //TextBox.ShortcutsEnabled为false 禁止右键和 ...
- socket error:10053
系统提示:10053,由于超时或其它失败,连接中止 服务端和客户端并没有出现连接错误或主动关闭连接 发生这个错误的原因往往是连接上了,但是长时间没有通信,所以连接被挂起了 防止的办法就是自己设计心跳包 ...