【二进制数据】
全球所有人都习惯使用十进制数,也许是因为远古时期人类使用手势交流的原因,人类使用十个手指表示十个数据。
中文使用一、二、三、四、五、六、七、八、九、十表示十个基础数字,并使用零表示没有任何数据,单个数字表示的数据范围是有限的,超过上限就使用多个数字的组合表示,高位数字表示低位数字十的倍数,高位一表示低位十的一倍,高位二表示低位十的两倍,这种多个数字组合值的表示方式称为十进制,阿拉伯数字最高表示九,十使用10表示,优点是将十的表示方式由两种统一为一种。
计算机使用二进制数据,通过半导体器件是否带电表示数字0和1。
移位运算
在十进制数据中,乘以10会向高位移动一位,一个数字向高位移动一位时等于原值的10倍,数据中的所有数字整体向高位移动一位等于数据整体乘以10,同理除以10会向低位移动一位。
二进制数据是遇二进一,高位1表示低位的2倍,所以二进制数据乘以2会向高位移动一位,除以2会向低位移动一位,在计算机中经常需要使用移位的方式操作二进制数据。
十进制:123 * 10 = 1230, 123 / 10 = 12.3
二进制:101 * 10 = 1010, 101 / 10 = 10.1
【数据进制转换】
整数十进制转二进制
将十进制数不断与2进行除法运算,结果保留余数,直到计算到1/2,之后将每次除法结果的余数当做二进制位进行组合,最开始的余数作为二进制数的低位,最后的余数作为二进制数的高位,即可得出对应的二进制数据。
38 / 2 = 19余0
19 / 2 = 9余1
9 / 2 = 4余1
4 / 2 = 2余0
2 / 2 = 1余0
1 / 2 = 0余1
十进制 38 转二进制为 100110。
转换原理如下:
1.第一次除以2,若能整除,则数据是双数,最低位为0,若不能整除,则数据是单数,最低位为1,二进制单数的最低位也为1,所以十进制数除以2的余数即是对应的二进制数的最低位。
2.第二次除以2,转换剩余的数字位,因为之前已经除以2并且不保留余数,等于二进制数据向低位移动一位并且不记录小数位,所以此时等于判断二进制整数次低位的值。
3.一直计算到1除以2,1是最小的非0整数,无法再进行整数除法,对应二进制数据的最高位,至此转换完毕。
整数二进制转十进制
二进制数据高位1表示低位1的两倍,根据此规律依次计算出每个二进制数字对应的十进制数据,之后相加即可。
比如:100110,其中的三个1分别表示十进制的32、4、2,三者相加等于38。
小数十进制转二进制
十进制使用低位5表示高位1的一半,二进制使用低位1表示高位1的一半,二进制的0.1等于十进制的0.5,二进制低位数字只能将高位数字平均分为2份,不能平均分为10份,所以十进制小数末尾数字必须是5才能使用二进制表示,否则转换时会丢失精度。
但即使十进制小数的最低位为5也不一定能完全转换为二进制,原因是二进制数据无法做到将一个数据平均分为十份,只能分为2的乘方份数,转换为十进制等于除以2、4、8、16,无法除以10,具体能否精确转换还需要判断十进制小数是否为2的乘方的倍数。
方式一
将十进制小数不断乘以2,每次乘法不计算整数部分,直到消除小数位,之后取每次乘法结果的整数部分组合为二进制小数。
0.125 * 2 = 0.25
0.25 * 2 = 0.5
0.5 * 2 = 1
十进制 0.125 转二进制为 0.001。
转换原理如下:
1.首先转换二进制小数的最高位,将十进制小数的最高位乘以2,之后观察结果是否向整数位进位。
若没有进位,则小数最高位为整数位1的一半以下,对应的十进制小数为0.5以下,对应的二进制小数为0.1以下,所以此时二进制小数的最高位为0。
若有进位,则小数最高位为整数位1的一半或以上,对应的十进制小数为0.5、或0.5以上,对应的二进制小数为0.1或0.1以上,所以此时二进制小数的最高位为1。
2.之后转换二进制小数的次高位,将十进制小数乘以2,从而让对应的二进制值向高位移动一位,二进制小数次高位变成最高位,因为第一步已经将数据整体乘以2,所以现在直接取第一步的结果即可,之后再次乘以2,观察是否向整数位进位,从而确定二进制小数次高位的值。
3.重复以上步骤,直到消除十进制数小数位,转换完毕。
方式二
将十进制小数还原为除法运算式,之后将两个整数除数转换为二进制,再计算两个二进制整数除法。
小数二进制转十进制
方式一
将二进制小数的每一位数字转换为对应的十进制小数,之后相加。
二进制0.1,表示十进制1的2分之1,等于0.5。
二进制0.01,表示十进制1的4分之1,等于0.25。
二进制0.001,表示十进制1的8分之1,等于0.125。
二进制小数0.101转十进制:0.5 + 0.125 = 0.625。
方式二
将二进制小数还原为二进制整数除法运算式,之后将二进制整数转换为十进制整数,再计算十进制整数除法。
0.001 = 001 / 1000 = 1 / 8 = 0.125
0.011 = 011 / 1000 = 3 / 8 = 0.375
0.101 = 101 / 1000 = 5 / 8 = 0.625
二进制小数转除法运算式的原理是使用位移,乘以10(这里的10表示二进制)向高位移动一位,除以10向低位移动一位,这里将二进制数向高位移动3位,等于乘以1000,若要保持原值不变,需要再除以1000,1000转换为十进制等于8。
方式三
将二进制小数的每个数字分别乘以2的负次方,最高位乘以2的负1次方,次高位乘以2的负2次方,以此类推,最后将计算结果相加。
比如将二进制小数0.011转换为十进制,步骤如下:
第一位为0,0乘以2的负1次方 = 0
第二位为1,1乘以2的负2次方 = 1 / 2^2 = 1 / 4 = 0.25
第三位为1,1乘以2的负3次方 = 1 / 2^3 = 1 / 8 = 0.125
最后 0.25 + 0.125 = 0.375
此方式的原理是将方式1和方式2进行组合。
【运算器设计原理】
计算机的运行是以逻辑电路为基础的,首先我们复习一下初中物理电路知识,了解逻辑电路的基础原理。
在电路中放置一个可以移动的衔铁,改变衔铁的位置可以控制电路连通或断开。
衔铁平时依靠弹性呈断开电路状态,在衔铁附近放置一个电磁铁,电磁铁通电产生磁性,吸引衔铁移动位置,将电路闭合,电路即可通电。
电磁铁断电,失去磁性,衔铁依靠弹性断开电路。
这样就实现了通过电磁铁控制电路的开关,这种通过电磁铁控制电路开关的器件称为电磁继电器。
使用继电器可以制作出三种基础的逻辑运算电路:与、或、非。
与运算,电路中放置两个继电器,两个继电器全部通电时,电路通电,可以使用串联电路实现。
或运算,电路中放置两个继电器,两个继电器有一个通电时,电路即可通电,可以使用并联电路实现。
非运算,电路中放置一个继电器,将电路通电状态取反,通电变为不通电,不通电变为通电。电路平时处于闭合状态,电磁铁通电产生磁性,改变衔铁位置后,电路变成断开状态,即可实现非运算。
以上三种基础逻辑运算电路还可以组合为复杂逻辑运算:
异或,判断两个子电路状态是否不同,若不同则电路通电,若相同则电路不通电。
与非,两个继电器全部通电时,电路不通电,等于先进行与运算、之后进行非运算。
或非,两个继电器有一个通电时,电路不通电,等于先进行或运算、之后进行非运算。
加法器
计算机使用带电与不带电两种状态表示二进制数字0和1,对于不产生进位的二进制加法可以使用或运算实现,分别比较两个数据中相同位置的数字是否至少有一个为1,是的话计算结果此位为1,否则此位为0。
但是加法运算是不可能避免产生进位的,只使用或运算无法实现完整的加法器,加法器应该首先使用与运算判断两个数字是否都为1,是的话则产生一个进位,否则再进行或运算。
完整的加法器计算两个数据相加时,每个二进制位都会计算3个数字相加,分别是两个加数和一个进位值,若没有进位则加0,实现方式很简单。
减法器
设计一个减法器要复杂的多,减法运算有很多逻辑判断分支,其中最复杂的是借位,若同位置数字中被减数为0、减数为1,则被减数需要向高位借位,如果紧邻的高位为0,还需要向更高的位借位,每次借位后都需要更新被减数的值,一次减法运算可能会发生多次借位,这些问题导致减法器的电路设计要比加法器复杂很多,运算速度也要慢得多,为了增加减法运算的速度,计算机使用加法代替减法,CPU中虽然有减法指令,但是内部还是将两个减数送到加法器中运算的。
使用十进制数来说明转换原理:
9 - 3 = 6
可以转换为:
9 + 7 = 16
16 - 10 = 6
转换原理很简单,因为 -3 与 +7 的结果正好相差10,所以 -3 转换为 +7 之后只需要再减10即可,而这里减10可以无需计算,只需要不保留进位产生的高位即可。
3和7相加的结果可以产生一个进位,并且低位全为0,这两个数满足相加的结果去除高位等于减10的条件,那3和7就可以称为彼此的补数。
对于 9 - 3 运算,只需要计算出3的补数即可将减法转换为加法,3的补数计算方式为 10 - 3 = 7,我们需要将减法转换为加法,而计算补数时却又产生了另一个减法,这个问题在十进制中很难解决,而在二进制数中却非常的简单。
补数的目的就是让两个数相加产生一个进位,并且低位全是0,在二进制加法中,如果两个数的每个位都相反,那计算结果的每个二进制位都为1,比如 1010 + 0101 = 1111,这个结果再 +1 就会产生进位,并且低位全是0。
所以我们计算 1010 的补数时,只需要将其每个位取反值,得到 0101,之后再 +1 即可,取反与 +1 可以合并为一个步骤,这样就得到了 1010 的补数为 0110。
【计算机存储数据的方式】
负数的存储方式
负数本质上是一个减数,计算机中减法使用加法代替,所以负数使用补数存储,称为补码。
计算机将一个数据按照是否有正负号分为两种类型:无符号数、有符号数。
1.无符号数,数据的所有二进制位都用于表示数值,只能表示正数。
2.有符号数,最高位称为符号位,用于表示正负号,0表示正,1表示负,剩余位称为数值位,若是负数则数值位使用补码存储。
比如使用8位二进制数表示-5,符号位为1,表示负数,5转换为二进制为101,之后取反加一转换为补码,等于111 1011,整合符号位得出二进制编码:1 111 1011。
计算结果为负数的问题
计算机使用加法代替减法,若减法结果为负数,则计算机会直接计算出正确结果的补数。
用10进制数来说明问题,5 - 6 = -1,转换为加法,10 - 6 = 4,5 + 4 = 9,显然9并不是 5 - 6 的正确结果,而是正确结果绝对值的补数。
当减法结果为负数时,减数大于被减数,减数的补数就会小于被减数的补数,被减数加小于自身补数的值,必定不会产生进位,所以计算结果也就没有去除高位这一步骤,导致比正确值大10。
若想得到正确结果,我们需要自行减去10,9 - 10 = -1, 从而得到 5 - 6 的正确结果。
若不减10的话,此数据正是减法结果正确值的补数,负数使用补码存储,所以计算机无需转换,直接存储补码即可。
当计算机使用加法代替减法运算时,若不会产生导致溢出的进位,则CPU认为计算结果是负数,将计算结果符号位设置为1,之后直接存储补码。
正0与负0编码重复的问题
对于有符号数来说,每个数据都有正负之分,但是将0分为正0和负0显然不合理,容易造成混乱,为了避免混乱,计算机将负0当做一个固定长度数据能够表示的最大负值再减1。
比如8位有符号数,去除符号位剩余7位,最大值为 111 1111,转换为十进制为 127,所以它的表示范围是 +127 到 -128,其中-128使用-0编码表示。
使用-0表示-128也不会引发混乱,在8位有符号数中,-128为最小的负数,不能再减,减1等于-129,超出表示范围,发生溢出,这种运算本身就是错误的,肯定会得到错误结果,错上加错也无所谓,但是可以再加,加1等于-127,-127可以使用正常编码方式表示。
小数的存储方式
3.1415926 可以使用如下科学计数法表示:
31415926 × 10^7
0.31415926 × 10^-1
计算机中的小数也是使用科学计数法,只不过底数由10改为2,使用科学计数法表示小数的方式也称为浮点表示法,使用浮点表示法的优势是可以充分利用存储器中的所有数字位,避免造成浪费,若不使用浮点表示法,那我们只能约定小数点在数据中固定的位置,比如一个长度32位的二进制数据,我们可以约定前16位表示整数,后16位表示小数,若小数为0.xxx,则整数位会浪费掉,若小数为xxx.0,则小数位会浪费掉。
根据科学计数法的计算原则,乘方指数+1,则尾数的值等于它乘以10。
二进制小数浮点表示法的乘方底数固定为2,指数+1则尾数乘以2,二进制小数向高位移动一位,指数-1则尾数除以2,小数向低位移动一位,修改指数即可移动小数点。
浮点数由三部分组成:符号位、阶码(乘方指数)、尾数。
符号位,表示小数的正负号。
阶码,表示乘方的指数。
尾数,科学计数法的尾数,它的数字位全部用于表示小数,整数部分默认为0,可以通过改变阶码的方式移动小数点的位置,从而表示整数位不为0的小数。
乘方的底数固定为2,无需使用任何数据存储,这是计算机的一种约定,从而节省两位存储空间。
IEEE754标准规定了三种长度的浮点数:
单精度浮点数,长度32位,符号位占1位,阶码长度8位,尾数长度23位。
双精度浮点数,长度64位,符号位占1位,阶码长度11位,尾数长度52位。
扩展双精度浮点数,长度80位,符号位占1位,阶码长度15位,尾数长度64位。
阶码表示指数的方式
阶码用于表示乘方的指数,指数可以是负数,但是阶码没有符号位,这样规定的原因是让长度有限的阶码表示更大范围的指数,那阶码如何表示负指数呢。
实际上计算机并不会直接存储指数,而是让指数加一个数据再存储,存储的数据称为阶码,阶码将有符号数的所有表示范围映射到无符号数中,从而避开负数,单精度浮点数加127,双精度浮点数加1023,扩展双精度浮点数加16383,增加的数据称为校正值。
以单精度浮点数为例介绍原理:
若指数范围 -127 至 0,则加127后等于 0 至 127,阶码使用 0 至 127 表示指数的 -127 至 0。
若指数范围 1 至 128,则加127后等于 128 至 255,阶码使用 128 至 255 表示指数的 1 至 128。
浮点数的规格化
当浮点数表示一个整数位为0的小数时,小数位的高位可能会有一个或多个0,比如 0.375 转换为二进制为 0.011。
为了节省存储空间,浮点数的尾数部分不存储这些高位的0,空出的存储元件可以存储更多的低位值,从而增加浮点数的精度,由此导致尾数与原值不同的问题,通过修改指数的方式将尾数还原,比如上述的 0.011 需要记录为 0.11 × 10^-1。
既然尾数的最高位必须是1,那这个位其实也可以省略,从而又节省一位存储元件,这是浮点数的约定,使用浮点数时再加上这个省略的1即可。
因为最高位的1被省略,尾数的次高位变成了最高位,导致尾数又向高位移动了一位,所以此时需要将指数再减1,还原尾数的原值。
比如0.011,使用浮点表示法应该存储为 0.1 × 10^-2,其中小数位包含一位隐藏的高位1,你也可以理解为 1.1 × 10^-2,只不过整数位的1不会被存储。
三种浮点数的最高位都必须为1,但是只有单精度、双精度浮点数会省略最高位的1不存储,而扩展双精度浮点数的最高位1不能省略。
对于以下浮点数,都属于非规格化的,无法使用:
1.单精度、双精度浮点数,尾数隐藏的最高位不是1。
2.扩展双精度浮点数,尾数原型的最高位不是1。
3.阶码为0的浮点数。
浮点数编码示例
示例1,单精度浮点数 0.625,转换为二进制为 0.101
符号位,这里是正数,符号位设置为0。
阶码,尾数最高位的1隐藏不存储,次高位变成了最高位,尾数向高位移动了一位,指数设置为-1,还原尾数原值,之后指数加校正值得出阶码,-1 + 127 = 126,转换为二进制为 0111 1110。
尾数,原值为101,最高位的1隐藏,尾数存储为01。
最终编码为:0 01111110 01000000000000000000000
示例2,单精度浮点数 -0.375,转换为二进制为 0.011
符号位为1,表示负数。
阶码,尾数首先向高位移动一位,去除最高位的0,之后将最高位的1隐藏,尾数总共向高位移动了两位,指数设置为-2,-2 + 127 = 125,转换为二进制为 0111 1101。
尾数,原值为011,高位的0和1不存储,实际存储为1。
最终编码为:1 01111101 10000000000000000000000
示例3,单精度浮点数 1.25,转换为二进制为 1.01
符号位为0,表示正数。
阶码,尾数向低位移动一位,消除整数位,之后小数位向高位移动一位,将最高位的1隐藏,最终小数位固定不变,指数为0,0 + 127 = 127,转换为二进制为 0111 1111。
尾数为01。
最终编码为:0 01111111 01000000000000000000000
【计算机硬件组成】
计算机主要由如下4种设备组成:
中央处理器,英文简称为CPU,提供逻辑运算和数学运算功能,是计算机的控制中心。
存储器,存储二进制数据。
输入设备,用于向CPU发送数据。
输出设备,用于接收CPU发出的数据。
中央处理器
中央处理器主要分为4个部分:控制器、运算器、缓存、寄存器。
1.控制器,控制CPU的运行,CPU对外提供的功能由指令确定,每一种功能对应一条指令。
2.运算器,负责进行数学运算、逻辑运算、移位运算。
3.寄存器,存储CPU执行时最频繁使用的数据,数据读写速度最快,容量也最小。
4.缓存,存储CPU次级频繁使用的数据,读写速度低于寄存器,存储容量高于寄存器。
CPU内部各部分使用片内总线相连,片内总线一次性可以传输的数据长度称为CPU位宽,比如64位CPU一次性可以传输长度64位的二进制数据,寄存器的长度一般与CPU位宽相同。
存储器
存储器用于存储二进制数据,存储器有两种基础操作:
1.写入操作,向存储器存入数据。
2.读取操作,调用存储器中的数据。
1个二进制数字称为一个比特位,英文名bit,简写为小写b,8个比特位组成一组使用,称为一个字节,英文名Byte,简写为大写B,计算机读写数据时至少操作一个字节,两个字节称为一个word。
为了更方便的描述存储器容量,还会以字节为基础组成的更大单位,这些单位都使用1024进制:
1024B = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
1024PB = 1EB
1024EB = 1ZB
1024ZB = 1YB
存储器中用于存储一个二进制数字的器件称为存储元件,8个存储元件组成一个存储单元,每个存储单元都有一个数据编号,称为存储单元地址,地址从0算起,0表示第一个地址,计算机使用此地址确定要操作的存储单元。
存储器按作用分为主存、辅存,也称为内存、外存,另外还有NOR Flash存储器,它集合了主存与辅存的特点。
主存
主存也称为随机存取存储器,英文简称RAM,是一种半导体器件存储器,可以看做是纳米级的微型电容,根据器件是否带电表示0和1。
主存的特点是可以单独读写任意一个存储单元,读写速度快于辅存,但是容量小,数据不能永久保存,断电后数据丢失,适用于存储计算机运行时需要使用的数据。
辅存
辅存读写速度低于主存,但是容量更大,数据可以长期存储,计算机断电后数据由辅存存储,计算机启动后数据需要从辅存读取到主存中再使用。
辅存存储数据的原理有很多:有用光盘实现的,有用磁盘实现的,有用半导体器件实现的。
辅存一般将多个存储单元组成一组使用,比如512B、1KB、2KB、4KB等等容量,读写数据时至少操作一组存储单元,多个小组还可以继续组合为一个大组,就像树枝分叉那样,这样可以减少内部线路复杂度、增加容量、降低制作成本。
NOR Flash
NOR Flash 没有统一的中文名称,可以理解为高速读取闪存,是一种半导体存储器,它集合了主存与辅存的特点,读取速度快、写入速度慢、断电后数据不会丢失,存储单元可以单独进行读数据操作,但是写入操作需要按组进行。
NOR Flash 用于存储计算机固件程序,固件是计算机启动后执行的第一个程序,用于检查计算机各种设备是否正常,之后引导操作系统执行,固件要求数据读取速度快,可以单独读取任意存储单元,但是很少有修改数据的需求,计算机启动后,CPU从固定的内存地址处读取指令开始执行,这个地址与 NOR Flash 存储器绑定,从而读取其中的固件执行。
输入输出设备
输入设备,向CPU发送数据,比如键盘、鼠标用于控制计算机运行,比如录音、录像设备用于形成计算机执行某种功能所需的数据。
输出设备,接收CPU发出的数据,比如显示器、音响用于将数据以人能够识别的方式展示,比如各种计算卡用于将数据继续进行加工计算,辅助CPU工作。
输入输出设备统称为IO设备,有些IO设备既有输入功能也有输出功能。
IO设备会对外提供一组寄存器,称为IO设备端口,用于与外界交换数据,CPU通过向IO设备端口写入数据控制IO设备的运行,比如显示器根据CPU发出的数据确定每个像素三原色的亮度,从而确定像素的颜色。
有些IO设备也会内置一块辅存,用于长期存储数据,比如某些设备可以由用户设置工作方式,设置的参数会保存在内部辅存中,防止断电后丢失。
计算机基础IO设备的运行、控制方式是通用的,比如键盘、鼠标、显示器,程序根据通用规则直接使用它们。
有些IO设备的运行、控制方式不通用,比如打印机,不同厂家的产品使用方式不同,此时需要通过厂家提供的设备驱动程序使用它。
总线与地址空间
总线用于将计算机各种设备与CPU连接,分为内存总线、IO总线,分别连接内存设备和IO设备,IO总线会再分出多个IO接口,分别连接不同的IO设备,所有的IO设备汇总连接到IO总线,然后由IO总线统一连接CPU,IO总线的使用由IO控制器负责分配和管理。
CPU在存储器中读写数据时,使用一个数据指定要读写的存储单元,这个数据称为地址,地址是CPU为存储单元分配的数字编号,CPU可以使用的地址范围称为地址空间,地址空间分为以下两种:
1.内存地址空间,绑定内存设备,内存地址分配给内存单元,使用内存总线传输数据。
2.IO设备地址空间,绑定IO设备,IO地址分配给IO设备端口,使用IO总线传输数据。
IO地址空间的不同范围分配给不同的IO接口,CPU通过读写不同范围的IO地址控制不同的IO设备运行,辅存是连接在IO总线中的,CPU将辅存当做IO设备管理,CPU并不能直接读写辅存中的存储单元,而是向辅存IO端口写入控制数据要求进行读写操作,之后辅存启动内部读写功能,并通过IO端口与CPU交换数据。
标签:10,01,计算机,二进制,IO,原理,数据,十进制,小数 From: https://www.cnblogs.com/alixyy/p/18160045