对于八进制来说,它的权重是8的n次幂,也可以表示成权重是2的3n次幂。八进制的数码为0~7,0~7的数码用二进制表示可以写成:K=。如果此时的权重是8的n次幂(2的3n次幂),那么此位的数码乘以权重(K*8的n次幂),用二进制表示就是:。按照二进制的规则,正好是连续三个数码。所以八进制转换二进制的方法如下:
例 :二进制1010110.01,分组001 010 110 . 010 –> 126.2
思考:为什么在上述图表中,二进制直接用四个数码来表示,八进制直接用两个数码来表示?
四个二进制的数码或者两个八进制的数码才可以表示到十进制的15。
在电路中,这些数码都是要存放的,每一个数码都需要一个小存储空间。当存储空间的个数是固定的时候,所表示的数字的大小也就有了范围。例:只考虑整数的情况下,三个数码的十进制表示000~999。
后续设计时,如果我们出现设计失误,将四个数码存放到三个存储空间里时,就会出现错误(综合器不一定报错),最终结果为将后面的三个数码存放到三个存储空间里了,最高位的那个数码丢掉了,一定要注意。不要在设计中看到某一个变量赋值为N,就一直以为这个变量为N,不一定,一定观察变量的存储空间的个数和N所需要的个数的对比。
思考:在电路中,数字N需要几个存储空间?
根据上一个问题的思考,一个存储空间只能存放一个数码,那就需要看数字N有多少个数码了。这样的想法是正确的吗?注意:在电路中,都是二进制表示。那么也就是数字N需要的存储空间的个数,应该是N转换成为二进制时,他的数码的个数。
例:十进制的25,首先转换成为二进制11001,所以需要5个存储空间。
思考:在设计电路时,需要把所有的数字都写成二进制吗?
目前设计大多数是写代码,代码想要形成电路,需要综合器的综合。而综合器是可以把任何进制的数字转换成为二进制的。注意:存储空间的问题。
思考:在赋值时,两个变量赋值的进制不相同,可以直接对比大小吗?
例 :在电路中变量A赋值十进制的25,变量B赋值十六进制的24,假设变量A和B的存储空间的个数可以放下本身赋值的数字,可以直接对比吗?答案是肯定的,我们经常说的进制不同不能相对比,那是对于人类自己看见的而言,但是对于设计来说,我们的赋值是在代码级别,距离真正的电路还有一个综合器的综合,综合器综合过后,所有的进制都是二进制,那就可以直接对比了。
BCD码(nary-Coded Decimal‎)又称二-十进制代码,亦称二进码十进数。是一种二进制的数字编码形式,用二进制编码的十进制代码。这种编码形式利用了四个位元来储存一个十进制的数码。利用四位二进制表示十进制数的个位或者十位等。
二进制码的10110,表示十进制的22,利用BCD码表示则为0010 0010。
在计算中会经常遇到负数,那么在数字电路中,怎么样来表示负数呢?
首先要认识到,无论是正数还是负数,都是人类赋予它的意义。同样的数字,在对他用不同的眼光来看待时,也会得到不同的结果。例:101,在十进制中它就是一百零一,如果用二进制来看,这就是十进制中的五。
当一个变量为无符号位时,就认为这个变量是正数,所有位按照自己的权重进行计算。如果一个变量为有符号位时,那么规定他的最高位为符号位(0:正数。1:负数),其他位用来表示数值。
下面讨论有符号数的表示。0011表示正三,1011表示负三,这样的表示方法对吗?首先表示方法没有对错之说,只是符合不符合场合。这个表示方法是不符合当代计算机中的表示方法的。在当代计算机中,不仅仅要描述数的表示,还要表示运算。很明显这两个数字相加不为0。
那应该如何表示负数呢?如果在只有四位的二进制,四位二进制可以表示16种状态,无符号数可以表示0到15,15+1=0,0-1=15,这两个算式是正确的。
图3 :四位二进制补码运算的例子
补码就是顺时针方向的长度。
符号和绝对值拼接到一起组成的码成为原码。
表示正数时,补码和原码是相同的;表示负数时,补码和原码不相同,两个绝对值相加应该为“一圈”。
二进制的位数和能够表示的有符号数的范围也是有关系的。例:四位二进制能够表示16种状态,它能够表示的范围[-8:7]。并不是负数比正数多一个,中间有一个0。
原码能够直观的看出大小,补码比较方便有符号位计算。在当代数字电路中,都是利用补码进行存储和运算的。
表示范围为-200到200,至少需要多少位二进制码才能表示?
-200到200一共有401种情况,需要9位来表示。9位的二进制表示有符号数时,能够表示-256到+255。
扩展符号位不改变数字大小。
正数不在叙述。对于负数来说,就是在前面加了一个“1”,是否会改变数字大小呢?补码计算原码的规则为:补码减1,符号位不变,其他位取反。而我们添加的“1”,正好在“其他位取反”中,无论扩展多少位,都不会改变数字大小的。
在电路中大多数都是二进制的信息,那我们如何能够看得到汉字或者字母呢?对于字母来说,我们来介绍一下ASCII码。
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
图4 :部分ASCII码对照表
汉字国标码,创建于1980年,目的为了使每个汉字有一个全国统一的代码而颁布了汉字编码的国家标准。每个汉字有个二进制编码,叫汉字国标码。在我国汉字代码标准GB2312-80中有6763个常用汉字规定了二进制编码。具体国标码的信息就不在叙述,有兴趣的读者可以自行查询。
“ABC”字母序列在计算机中存储的形式按照ASCII码存储,十六进制的“41、42、43”。“郝旭帅”汉字序列在计算机中存储的形式按照汉字国标码存储,十六进制的“BA、C2、D0、F1、CB、A7”。
上述叙述的几种计数或者表示规则,都是非常常用的几种。在某些特殊的场合我们也可以自己编写规则,类似于24进制数,用5个二进制表示一个24进制数中的数字,都是可以的。
在数字电路中,只要是发送方和接收方能够统一好编码规则,就是可以的。
如果在数字电路中表示小数?方法有定点数和浮点数(浮点数不做介绍)。
定点数。
定点格式,即约定电路中所有数据的小数点位置是固定不变的。
对于整数而言,小数点默认位置在最后一位的后面。例:二进制的101表示十进制的5,小数点的位置就在101的后面。
如果是有小数呢?那如何来表示呢?例:十进制的5.5。
有小数时,就不能够把点放在最后一位的后面了,因为要存放小数,所以点必须在中间。当用8位来表示时,规定四位表示整数,四位表示小数:0101.1000,小数点并不是真实存在的,只是我们规定的而已。
也可以有另外一种理解,整数用的基础值是2的0次幂,所以所有的整数直接编写即可。如果有小数的话,基础值就要有所变化,假如是2的-3次幂。那么表示十进制的5时,就会变为101000。
定点、定点就是定好了小数点的位置,也就是定好基础值。
浮点数即小数点的位置可以浮动,利用专门的几个数码确定小数点的位置。这里不做过多介绍,有兴趣的读者,可以自行查阅相关资料。