计组中基本概念、计算机存储单位、进制转换



前言

要进入大二下学期了,看了看课表,又有计组又有操作系统,这个寒假先尽力都看看视频吧

此篇文章放在计算机组成原理模块,主要是针对计组的基本概念做一个笔记,方便我近期对其的学习,讲计算机中的进制转换也一并放在本篇里做一个梳理。

一、二部分内容来源于博客 :[作者:Asuiiiyi](计算机基础 | 谈一谈计算机的信息单位(地址,内存,以及进制转换)_Asuiiiyi的博客-CSDN博客_内存进制转换)
 
 

一、信息单位是什么?

1和0是计算机储存信息化成二进制的基本单位,在电脑上看到的所有一切都是由1和0两个数组成的,一个即是一个比特(bit)位,8位(bit)等于一个字节,在电脑中看到的图像视频等都是计算机通过对储存器中无数个1和0的计算得来的。

那么如何通过一堆的1和0中辨别出想要的信息呢?

这就涉及到了地址了。
 
 

二、地址

img

我们以32位机器为例子,高低电频分别由1和0表示,那么32根地址线就可以组成32个比特位,通过比特位上的1和0的排列组合排列出来二进制数字的可能就有2^32种(就是地址)

其中,每一种 可能 就是对应着每一个 地址 !

img

而计算机中,一个地址管理一个字节(byte),所以232个地址自然就管理232个字节(byte)

关于地址的例子:

在编译器上定义一个整型 a = 1,打开内存找到 a 的地址,最左端的 “0x0113FE10"(这是十六进制的,换算成二进制就是 “00000001 00010011 11111110 00010000”)就是这个时候int整型 a的地址。 是,但不完全是(doge)。

img

上文说到,一个地址管理一个字节,那么int整型变量不是四个字节吗?为什么 a 只有一个地址呢?不应该是四个地址吗?

确实是四个地址,而且是连续的,其实上文的**“0x0113FE10"真正指向的是“01”**

我们直接remake,再来一遍。

img

img

这才是 a 真正的地址。(这也应证了“一个地址管理一个字节”的道理)

这里可能有些小伙伴会想到,a不是等于1吗,十六进制储存应该是 00 00 00 01才对,为什么这里是反的?

其实这里就涉及到了编译器大小端字节排序的问题,关于这个暂时不讲,我们后续再补充。


 

三、计组基本概念

  • 位(bit) 数据存储的最小单位,一个位的取值只能是0或1
  • 字节(B/Byte) 1个字节等于8位二进制位,即1Byte=8bit
  • 字(Word) 在计算机中,一串数码作为一个整体来处理或运算的,称为一个字

字的位数称为字长,字通常分若干个字节。


计算机常用存储单位:(计算机存储容量单位为2^10进制,也就是1024进制)

存储单位:位(bit) -> 字节(B) -> 千字节 (KB) -> 兆字节 (MB) -> 吉字节 (GB) -> TB -> PB -> EB、ZB、YB 、NB、DB等

常见单位之间的换算:IEC标准(国际电工委员会标准):SI标准(国际单位制):
1TB=1024GB2^40=1TB10^15=1PB
1GB=1024MB2^30=1GB10^12=1TB
1MB=1024KB2^20=1MB10^9=1GB
1KB=1024B2^10=1KB10^6=1MB
1B=8b2^3=1B10^3=1KB

顺带一提,如1024 Byte应为1 Kilo binary Byte,严格缩写为1 KiB,但日常生活中一般会省略”i“表示成1 KB。但在国际单位制SI里,1 KB即1 KiloByte,表示1000 Byte,这就存在一定的歧义。一般情况下,操作系统用的KB实际上是KiB( Kilo binary Byte),硬件厂商用的KB才是真正的KB(KiloByte)

其他单位以此类推


  • 字长(机器字长) 表示机器CPU的处理能力,即CPU在单位时间内能处理的最大二进制数的位数称为字长

若字长为32位,则1字=32bit=4B,表明存储器一次可以处理4个存储单元,指令长度为4个存储单元。
若字长为16位,则1字=16bit=2B,表明存储器一次可以处理2个存储单元,指令长度为2个存储单元。

字长是个泛指的概念,机器字长是一个特定的衡量计算机标准的性能指标,指计算机同时能够处理的二进制位数,字长同样是指二进制位数,但要看具体的情景,在不影响歧义的情况下可以用.

  • 指令字长 一个指令中包含二进制代码的位数。

指令字长一般取存储字长的整数倍,若指令字长的等于存储字长的 2 倍,则需要 2 个访存周期来取出一条指令;若指令字长的等于存储字长,则取指周期 = 机器周期。

注:冯诺依曼机中,指令和数据同等重要,都存放在存储器中,并可按地址寻访。

  • 存储单元 CPU访问存储器的最小单位,每个存储单元都有一个地址

一个存储单元占一个字节(1B,也就是8位二进制位)。

  • 存储字长 存储器中一个存储单元(存储地址)所存储的二进制代码的位数

指令字长和存储字长都必须是字节的整数倍

早期的存储字长一般与指令字长、字长相等,因此访问一次主存便可以取出一条指令或一个数据。随着计算机的发展,指令字长、字长都可变,但必须都是字节的整数倍。

  • 存储容量 存储容量是主存中能存放二进制代码的总位数

按位计算:存储容量 = 存储单元个数 * 存储字长(每个存储单元的位数)
按字节计算: 存储容量 = 存储单元个数 * 存储字长 / 8

  • 地址线 地址线一次确定一个存储单元,地址线上值可能取的所有组合确定了存储单元的个数,用来传输地址信息

字节用来计量存储容量:存储单元的个数 = 存储容量 = 2^地址线的条数

一个cpu的N根地址总线,则可以说这个CPU的地址总线宽度为N。这样cpu最多可以寻址2^N个内存单元
例:若题目中给出存储容量=4GB,则内存容量=4GB=22 * 230(b)=232(b)
,一个存储单元占一个字节,故存储单元个数为 232,地址线条数是32根。

  • 数据线 数据线确定存储字长,数据线的条数 = 字长的位数

  • 寻址空间与寻址范围
    寻址范围只是一个数字范围,不带有单位,而寻址范围的大小指的是寻址空间的大小,寻址空间指能够寻址的最大容 量, 单位一般用MB、B来表示。

其中有两个知识点比较重要:

1、按字节寻址

一组地址线的每个不同状态对应一个字节的地址,存储空间的最小编址单位是字节。

例如,对24位地址线的主存而言(也就是有24根地址线),按字节寻址,每根线有两个状态,那么24根地址线组成的地址信号就有224个不同的状态,每个状态对应一个字节的地址空间的话,那么24根地址线的可寻址空间为224B,即16MB。

2、按字寻址

一组地址线的每个不同状态对应一个字的地址,存储空间的最小编址单位是字。

一个字由若干个字节构成,所以计算机在寻址过程中会区分字里面的字节,即会给字里面的字节编址,这样就会占用部分地址线,例如有24根地址线,机器字长为16位,若按字寻址的话,16位=2个字节,需要占用一根地址线用来字内寻址,这样就剩下23根地址线,故按字寻址范围是2^23W(W是字长的意思),也就是8MW。【真正用于按字寻址的地址线只有24-1=23根】

理解:计算机以此方式寻址时,每一个地址值指向了一个字,这里指向的便不是按字节寻址中的字节了。如前文所述对字的定义,一个字里面有任意个字节,那么计算机如何知道其地址指向的到底是字中的第几个字节呢?这便需要地址线中分出一部分标出其所指的到底是字中的第一个字节,还是第二个,亦或是其他。

 
 

四、进制转换

进制也就是进位计数制。是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。对于任何一种进制 => x进制,就表示每一个位置上的数运算时都是逢x进一位,如:十进制逢十进一,二进制逢二进一,八进制逢八进一,十六进制逢十六进一

进位制/位置计数法是一种记数方式,故亦称进位记数法/位值计数法,可以用有限的数字符号代表所有的数值。可使用数字符号的数目称为基数,基数为n,即可称n进位制,简称n进制。现在最常用的是十进制

进制基数数码第i位位权表示形式
20、12^(i-1)B
80、1 ~ 78^(i-1)O
100、1 ~ 910^(i-1)D
十六160 ~ 9 A ~ F16^(i-1)H

(一)表示方法

二进制:

它由两个数码0,1组成,二进制数运算规律是逢二进一。
为区别于其它进制,二进制数的书写通常在数的右下方注上基数2,或在后面加B表示。

例如:二进制数10110011可以写成(10110011)2,或写成10110011B。
 
八进制:

由于二进制数据的基数R较小,所以二进制数据的书写和阅读不方便,为此,在小型机中引入了八进制。
八进制的基数R=8=2^3,有数码0、1、2、3、4、5、6、7,并且每个数码正好对应三位二进制数,所以八进制能很好地反映二进制。八进制用下标8或数据后面加O表示,

例如:八进制数据: (352.264)8或352.264O或者(497.351)O。
 
十进制:

由于人类解剖学的特点,双手共有十根手指,故在人类自发采用的进位制中,十进制是使用最为普遍的一种。
十进制的基数为10,数码由0-9组成,计数规律逢十进一。

例如:十进制数据:(159)10或者(967)D。
 
十六进制:

由于二进制数在使用中位数太长,不容易记忆,所以又提出了十六进制数。
它由十六个数码:数字0~9加上字母A-F组成(它们分别表示十进制数10~15),十六进制数运算规律是逢十六进一,即基数R=16=2^4,通常在表示时用尾部标志H或下标16以示区别,在c语言中用添加前缀0x以表示十六进制数。

例如:十六进制数4AC8可写成(4AC8)16,或写成(4AC8)H。

 

(二)进制间的转换

1、R进制转换成十进制

R进制转换十进制时,方法步骤:

按权展开相加(系数乘以基数的权次方相加)
系数:就是就是每一位上的数,
基数:R进制的基数就是R,
权:从右侧开始每一位的索引值从0开始,每一位对应的索引值就是权值.
 
(1)二进制转换为十进制

在二进制数10101中,共有五位系数。计算应从低位到高位依次乘以2的i次方最后相加( i为每一位数字的权重,它是随着低位向高位的进发而每增加1,直到没有系数为止)。

例: 计算二进制数 (10101)B = (____)D

解: (10101) B= 1*24+0*23+1*22+0*21+1*2^0=1+0+4+0+16=21

所以  (10101) B= (21) D

带小数部分:

对于二进制数带小数,以整数的最低位索引权重0为界限,整数部分是大于0的正整数且从右向左,从低位到高位按权分配;而小数部分则是小于0的负整数且从左向右,从高位到低位按权分配的。

例: 计算二进制数(1101.01) B=(____) D

解: ( 1101.01 ) 2 = 整数部分:1× 2^3 + 1× 2^2 + 0× 2^1 + 1× 2^0 + 小数部分:0×2^(-1) + 1×2^(-2) = 8 + 4 + 1 + 0.25 = 13.25

所以 (1101.01) B= (13.25) D

 
(2)八进制转换为十进制

同理,八进制转换十进制也是每一位乘以8的i次方最终相加而成得到结果。

例:  ( 267.5 ) 8 = (____) D

解: ( 267.5 ) 8 = 2 × 8^2 + 6 × 8^1 + 7 × 8^0 + 5 × 8^(-1) = 128 + 48 + 7 + 0.625 = 183.625

所以  ( 267.5 ) 8 =(183.625) D

 
(3)十六进制转换为十进制

16进制数共有16位数码,∈{ 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}
A代表10,B代表11,C代表12,D代表13,E代表14,F代表15

例如:  ( 4A8F.5 ) H =(____)D

解:  ( 4A8F.5 ) H = 4×16^3 + 10×16^2 + 8×16^1 + 15×16^0 + 5×16^(-1) = 16384 + 2560 + 128 + 15 + 0.3125 = 19087.3125

所以  ( 4A8F.5 ) H =(19087.3125)D

再次总结一句话:R进制转换十进制的口诀就是方法就是按权展开相加(系数乘以基数的权次方相加)

 

2、十进制转换为R进制

十进制转换R进制时,方法步骤:

将十进制整数转换成R进制整数采用“除R取倒余法”。即将十进制整数除以R,得到一个商和一个余数;再将商除以R,又得到一个商和一个余数; 以此类推,直到商等于零为止。每次得到的余数的倒排列,就是对应R进制数的各位数。

​十进制小数转换成R进制小数。十进制小数转换成R进制小数是用“乘R取整法”。即用R逐次去乘十进制小数,以此类推,直到余数为1停止。将每次得到的积的整数部分按各自出现的先后顺序依次排列(与整数的排列顺序相反),就得到相对应的R进制小数。
 
(1)十进制转换为二进制

整数部分除二取余,逆序排列,小数部分乘2取整,顺序排列

例:将25转换为二进制数

解:25÷2=12 余数1

  12÷2=6 余数0

   6÷2=3 余数0

   3÷2=1 余数1

  1÷2=0 余数1 最终将余数倒着写出来即可!

所以(25) 10 =(11001)2

带小数部分:

例:(25.125)D==转换为二进制数

解: 整数部分 :(25) 10 =(11001)2

​   小数部分 : 0.125 * 2 = 0.25…整0

​          0.25 * 2 = 0.50……整0

        0.50 * 2 = 1.0……整1

所以(0.125) D=(0.001) B,与整数相加而成就是(25.125) 10 =(11001.001)2

 
(2)十进制转换为八进制

整数部分除八取余,逆序排列,小数部分乘八取整,顺序排列

例:将十进制数1000,转换为八进制数。

解:1000/8=125, 余数为0
   125/8=15, 余数为5
   15/8=1, 余数为7
   1/8=0, 余数为1
从上往下看这些余数,逆序写出就是1750,要注意的是最后一定要除到0为止,也就是最后一步1/8=0,一定要除到0.

所以(1000) D=(1750) O

 
(3)十进制转换为十六进制

整数部分除十六取余,逆序排列,小数部分乘十六取整,顺序排列

例: 将十进制数(0.9032) D转化成16进制小数

解: 0.9032*16=14.4512 取整数14 即E

​    0.4512*16=7.2192 取整数7

​    0.2192*16=3.5072 取整数3

​    0.5072*16=8.1152 取整数8

​    0.1152*16=1.8432 取整数1

所以:(0.9032) D= (0.E7381) H

 

3、二进制与八进制的转换

(1)先了解二进制数与八进制数之间的对应关系。

img

(2)二进制转换成八进制的方法是,取三合一法,即从二进制的小数点为分界点,向左(或向右)每三位取成一位。

img

(3)分好组以后,对照二进制与八进制数的对应表,将三位二进制按权相加,得到的数就是一位八进制数,然后按顺序排列,小数点的位置不变,最后得到的就是八进制数。

img

(4)这里需要注意的是,在向左(或向右)取三位时,取到最高位(最低位)如果无法凑足三位,就可以在小数点的最左边(或最右边)补0,进行换算。

img
 

​ 下面看看将八进制转为二进制,反过来啦,方法就是一分三,即一个八进制数分成三个二进制数,用三位二进制按权相加,最后得到二进制,小数点依旧就可以了。

img
 

4、二进制与十六进制的转换

(1)二进制数与十六进制数之间的对应关系。

img

(2)二进制转换成十六进制的方法是,取四合一法,即从二进制的小数点为分界点,向左(或向右)每四位取成一位。

img

(3)分好组以后,对照二进制与十六进制数的对应表,将四位二进制按权相加,得到的数就是一位十六进制数,然后按顺序排列,小数点的位置不变,最后得到的就是十六进制数。

img

(4)在向左(或向右)取四位时,取到最高位(最低位)如果无法凑足四位,就可以在小数点的最左边(或最右边)补0,进行换算,与八进制同理。

 

十六进制转为二进制,反过来啦,方法就是一分四,即一个十六进制数分成四个二进制数,用四位二进制按权相加,最后得到二进制数。

img

 

5、八进制与十六进制的转换

八进制与十六进制相互转换时,需要用到中间值–二进制,二进制是八进制与十六进制相互转换的桥梁。这样做不仅方便,而且不易出错。具体的就不再进行过多讲解了。

​ 八进制转换十六进制: 八进制==>二进制==>十六进制

​ 十六进制转换八进制: 十六进制==>二进制==>八进制


文章以做笔记学习为主要目的

参考博客1:作者Mongo_girl

参考博客2:作者云逸943(个人觉得大佬写的进制转换非常好,大家可以去三连哦,我这里也就是整理了一下,让我看笔记的时候更符合我的性格)

若有侵权行为,请联系博主联系我删除,新人博主,请多关照,谢谢

  • 10
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈七.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值