计算机进制内存模块详讲-新手必看(超详细!)
Posted 码码咪呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机进制内存模块详讲-新手必看(超详细!)相关的知识,希望对你有一定的参考价值。
本文旨在让你掌握最基本的计算机进制及内存的知识,相信入门的朋友看完后大有帮助
因为部分排版原因电脑观看效果最佳
文中开头介绍部分有些啰嗦 可以点击目录跳转至对应地方观看
关联教程直达车-点击C语言入门知识串讲跳转
printf("感谢观看!");
一、进制、编程语言的出现
首先我们为什么要学进制?以及进制是什么?
计算机进制是入门知识,也是必须了解的知识。相信大多数人就算不知道具体是什么 也多少听说过二进制之类的,至于具体是什么,或许不知道,但就是在脑子里有印象/doge
我们需要知道,计算机并不真是无比智能到你说啥它干啥,不然还要程序员干啥,它只听程序员的,换个说法就是,程序员能让它听他的,说到底也就是程序员掌握有与计算机交汇的语言,也就是常说的编程语言、汇编语言、二进制语言等,程序员就是通过掌握这些语言对计算机发送指令设计程序,让计算机实现一系列操作。
这里很令人好奇,为什么计算机能识得这些语言,程序员写的代码,能实现那么多不可思议的功能,什么智能手机,人工智能等电子产品令人觉得匪夷所思...
下面带你了解计算机的奇妙发展
目录
1. 0/1 基本原理
我们知道计算机只是机器也就是铁疙瘩,并不是有思想的人类能够独立思考,它的一切行为都是以人的意志为中心进行灌输的,计算机的电路中所包含的信息都来自电信号,而且为了方便地区分输出的是高电压和低电压,早期的操作人员通过带有孔的纸带将程序输入电脑进行编译(对纸条打点),点代表1、0,即它其实只能通过电流识别0、1,而二进制就是这样由来的,因此0、1二进制是计算机的最基本单元,然后计算机科学家就通过这些编码赋予了一定意义,这样最早的二进制语言就实现了。
随着计算机的逐步应用开发,人们逐渐意识到 纯粹的 0、1编码,多而繁琐 根本不能轻易完成什么重大的任务,后面出现了汇编语言,操作人员每人一个小册子(指令小册子),操作员对着册子对计算机编码,虽然这样相比之前好得多但开发人员因为指令多而繁杂也是非常非常辛苦。因此计算机的发展迫切需要更加全面便捷的语言,也就是最初的A语言、B语言 发展至今的 C、JAVA、C#、C++、Python...等功能各异长处不同的语言
二、内存基本知识
在讲进制方面的知识前,必须得提一下计算机内存,从之前的学习我们知道,我们讲解各种数据类型的变量时用 sizeof () 操作符求了一下空间大小,由此可见,每个变量都占有一定的内存空间,我们这里所说的内存到底指的是什么?是不是和生活中买电脑时的8G/16G/32G内存有相应的关联?硬盘、网盘也能存储东西,在电脑上有何差别呢?
内存是计算机的运算空间,计算机里面的所有计算都依赖内存进行,内存按运行速率低到高有 硬盘、内存、缓冲区、寄存器等 下面寄存器处会详细讲
在我们生活中 地球就相当于一个大的内存单元 存储着所有的人类 人类被分布在每个国家 我们可以通过这个国家划分的 省市县镇村等具体到找到每家每户 并且每个人都有独特的身份证号码编号,同理 计算机会将自己的内存划分成这么多细小的单元 我们知道计算机还要进行各种复杂的运算 就像人类的实名制一样 它也必须对每一个单元进行编号 编号后还要进行使用 因而它有效的空间就会显得相形见绌 所以它必须进行更高效的内存管理机制
=> 当我们需要的时候 (比如定义变量) 它会随机租借给该变量一个空余的内存单元--我们知道变量的大小单位是byte(下面会有为什么最小单位是byte的推导过程), 而当使用完成之后(局部、全局变量)这个变量就会自动销毁,重新释放分配给它的内存空间以待其他需要空间的地方使用,而这就是变量 的 可行域生命周期的由来,原理就是 计算机高效便捷的内存管理机制
1. 内存机理
下面我们讨论下 计算机所分配的找到某个数值的编号是多少?以及为什么数据类型定义的基本单位是 byte而不是更细小的bit,并且细化一下相关的运行机制
这里将计算机内存里面分配的空间编上号 相当于每个人的身份证号码,这样能快速找到对应的值,这些空间我们称之为地址,而地址是怎么产生以及表示的呢?
1.地址的产生分配
计算机有32/64位两种操作系统,以32位为例,32位的系统里面 有32根由 0/1构成的地址线,上面也有解释到 计算机将电信号转换成数字信号0/1这是我们与计算机交流的根本,32个序列由32个不同的 0/1排列构成一个特定的数一般用十、十六进制来表示(需要了解下面进制的转换)
运用数学知识 0/1两种情况 32个序列 共有 2^32 种情况 而每个小格子都有一个特定的地址,因此小格子也就是我们上面提到的地址就有2^32个,因此编号(地址)就是0-2^32 格子从头排到尾,现在我们需要知道每个格子占用了多少的内存空间:
同理64位操作系统亦然
2. 地址的空间占用
已知 计算机里面的基本单位及其换算 如下所示:
我们需要讨论一下每个格子占用了多少空间,这里我们假设 2^32 个格子它每个格子占用了 1个bit 也就是
1. 2^32 个bit 位
2. 根据 下面图中基本单位之间的换算 利用计算器
根据单位转换计算所得,如果以bit作为每个地址的基本单位,那我们最终得到的只有0.5G的使用内存
1. 若选用 bit 作单位 那我们知道 一个 char 就需要用掉8个格子 int 需要用掉 32个格子 极大地造成了浪费 不合常理
2. 0.5G 的 空间 远无法完成所需
我们通过计算得出bit作为基本单位是有问题的,那如果我们换成byte作为基本单位,那在bit的基础上 乘 8 则,我们可用的 约 4GB的内存
1. 如果我们换成byte作为基本单位,char 只需要1个格子就行 int 也只需要 4个格子
2. 能使用4G空间 满足基本所需
3. 而至于如KB作基本单位 char 就只需要 XX分之一个格子就行,格子是独有的 不是共有的 这样会造成紊乱 不符实际
3. 地址的表示方法
地址我们常用表示它的编号的方法就是它 二 进制序列对应的 十六进制数字 即 二进制转0/1序列到 十 进制然后再转到十六进制,形如 0x00AFFC94 由0x先开头的就是十六进制,这里结合下面进制转换的内容观看
而16进制是二进制的简写形式 我们知道 一个int变量都有32个序列 那样写出来只会让人眼花缭乱 因此规定了16进制表示法 1个 十六进制数 等于 4个二进制序列 因此本来写32个数 而对应的转换规则就是 将对应的十六进制数用对应4个二进制序列表示出来(很多人不理解这个转换规则,这个在下面16进制与2进制之间转换会详细讲) 现在只需要写8个数就能解决 极大地进行了简化 ,所以这里只是表达方式不一样罢了 我们可以通过这些地址准确找到我们需要找到的变量等
=> 取地址
而我们知道 既然int 之类的内存分配需要四个格子 每个格子都有编号 ,故而规定了以开头的(小的)为它存储的地址,也就是说当我们取 int地址的时候,取到的会是所分配的四个格子里面最小的一个 如 6A 6B 6C 6D(十六进制表示) 先取6A 其他的通过依次加就能推出来
因此其取得的地址就是
这里在后面十六进制里面会有举例证明
2. 寄存器
寄存器是类似于内存一样的空间 与之类似的有 网盘 硬盘 内存 高速缓冲区 寄存器 它们的存储空间依次减少 但是运行效率越来越快,而运行效率是由CPU中央处理器运行的速度决定的的,早期的时候数据存储在内存里面,CPU在内存里面拿数据进行运算,两者的速度差不了太多,随着计算机的发展 CPU的运行效率变得越来越快 以至于内存已经满足不了计算机,因此规定了 运行速率更快但内存含量更低的 高速缓冲区和寄存器(造价更高),每次只需要将其他地方的数据推送到寄存器 保证每时CPU都能在寄存器里面拿到数据进行运算,这样下来整体的效率就提了上来,它们之间基本关系如图所示:
三、常见的进制
二进制构成了整个计算机体系,我们平时生活学习使用的数字都是十进制 生活中的数都由0-9构成注意不是0-10,因此平时基本看不到 0、1序列的表示,也就是说在计算机里面也对应有相应的转换规则,通过这些转换规则将0、1序列转换成使我们能够理解的,即转换成字符的形式(键盘上的都是字符)
下面我们来看一张表:
可以看见 我们平时看见的字符,一些符号、字母 在计算机里面都规定了各自的十进制数字,从而计算机只需要将这些十进制转化成对应字符就能够让人读懂,我们键盘上的字符也是对应的ASCII 码表,比如 这里打印 字母 Z 及其 十进制数
这里我们介绍一下 常见的进制 以及它们之间的相互转换
二进制 | 十进制 |
---|---|
相互转换 | 十六进制 |
进制转换就是进制之间相互转化,计算机就是通过进制的转换过程变得让人们易于理解和编程,我们平时有时候接触进制的时候总是迷迷糊糊的也不知道人怎么 一会 2^n、一会儿 16^n 到底怎么回事,现在就来详细讲讲 它们间的转换
1. 十进制
十进制: 由 0~9的数字组成 生活中所使用的阿拉伯数字 就是 由0~9构成的,其中 逢10进位 10^n为权 基数为 10
通过这个例子能直观的看出权 和基数的含义是什么
我们这里肯定会疑问 各自基数上的次方数如何得到,并且最终结果是 所有权的累加值,其运算机理如图所示,其他进制方法亦然
该图示的方法是转化为10进制的方法 下面示例中角标是几就代表几进制
2. 二进制
二进制:刚刚提过二进制就是最基本的 0/1 序列 由 0/1组成 逢2进位 2^n 为权 基数是 2
3. 十六进制
十六进制: 由 0 ~ 9 A BCDEF 共十五位字符表示 1~15 逢16进位 16^n为权 基数16
十六进制是二进制的简写 方便专业的人员进行书写进制数据,其中十六进制的1位数 等于 二进制的 4位数 它们之间的转化遵循 十进制与二进制的转换
用面(5E)举例 这里 我们将(5E)拆写成 (5 14)然后分别写出5 和 14的 4位二进制序列 这便是 十六进制与二进制的转换机理 下面也会细讲
也许在我们学习过程中你会发现 程序调试起来后 内存窗口出现的 那些个 0x00AFFC94 好像就是这样 字母数字的 我们来看看,结合之前所讲到的内存知识
分析下图:
1. 我们看到系统中内存存在形式是更为简便的十六进制表示方法
2. 图示 int 定义的 a 是四个字节的 取地址偏偏取了 0a D8 后面 00 00 00 的部分分别是 D9 DA DB 3. 因此知道 取地址的时候默认的由低到高,取最低的作为地址 其他可以往上加得到,每次调试地址可能是变化的 是因为内存随机分配的缘故
十六进制与二进制之间的转换 :无非就遵循上面规则 1个十六进制的数 等于 4个二进制序列 我们只需要将十六进制对应的每个数字转换为对应的4个二进制序列就行
1.比如下面 十六进制的 (41) 拆开 (4 1)然后再 写出 4 / 1对应的 4个二进制序列 0100 0001 最后就是它的二进制表示就是(01000001)
2. 十六进制(D6)写成拆开的 (D 6)然后 转化为 十进制数字形式 D对应十进制 13( 13 6 )
写出 13 / 6 对应的4位二进制序列 13 --1101 / 6 --- 0110 最后 (11010110)即为所求
学到这里上面ASCII表的基本运作机理 你应该已经了然于胸 无非就是规定一些字符(普通人能直观看懂的符号)然后每个字符都对应相应的 10进制数字 然后 计算机只需要将这些10进制数字转换成2进制数字 就能完成与计算机之间的基本交互,而10进制到2进制的转换我们初学做个了解就行
4. 高进制到低进制之间的转换
前面我们已近熟悉过了 各个进制到 10进制之间的转换 —— 各自权的和
而由高进制 10/16 到 2 进制之间 转换 我们只需要 除以相应的 基数 取余数 当商0时不再除基数 然后所有余数进行倒序排列就是对应转换后的数
用图来表示就是
16 进制与 2进制之间 转换就不用说了 刚才已说过 两者只是不同的表示形式
作为了解这个知识只需要熟练掌握 10进制转化成2进制的数 简单的将数字转化为对应二进制序列
四、常见内存操作
1. 原码、补码、反码
整数在计算机里面有原码、反码、补码三种存储方式
整数是以二进制的形式存储的(从上面介绍就可以知道)
有符号的整数二进制得最高位 0 表示正数 1表示负数
计算机里面规定了
正数的源码 补码 反码都是一样的
我们在分析一个变量的二进制序列时 要注意看它的类型 不同的类型得到的 bit 位是不同的 比如下面以int举例
负数的 原码 反码 补码 需要计算得到
计算机里面存储整数时存储的是补码,计算时也用的是补码
2 . 移位、取反操作符
接 C语言入门知识串讲 里面的操作符内容–移位及取反操作符
注意:这里所有的按位 都是指按二进制位 最好将上面的二进制转换的知识跟着算一遍会更加轻松
- 位操作符 ( &、 | 、^)
按位与 &
按位或 |
按位异或 ^
用数学中的 真1假0 命题 来助记就是
1. 按位与 & 有一个是假命题就是假命题
2. 按位或 | 有一个真命题就是真命题 全为假命题才是假命题
3. 按位异或 ^ 命题相同就是假命题 命题相异就是真命题
- 左移操作符(右移的原理一样 向右移动 空缺的部分用 0 补位)
- 取反操作符
五、总结归纳
1.通过上面的例子我们可以了解到 基本的 进制之间的转换 2-10-16 而较为难见到的 8进制之类的就不做论述
2.我们只需要了解介绍的基本的 换算 二进制 十进制 十六进制之间的 转换在涉及内存序列这些的时候就不会太懵
3.这里的学习对于指针的进一步了解会有很大的帮助
4.可以点击C语言入门知识串讲跳转
待补充… …
码字不易,给个三连可好!!!
看到这,希望投点宝贵的意见,并且能够从其中学到对你有用的知识
以上是关于计算机进制内存模块详讲-新手必看(超详细!)的主要内容,如果未能解决你的问题,请参考以下文章