数字电路与逻辑设计
上QQ阅读APP看书,第一时间看更新

1.2 信息的逻辑表示

信息是逻辑学研究的对象,信息一般是指客观存在的一切事物通过物质载体所发出的消息、情报、指令、数据和信号中所包含的一切可传递和交换的内容。数字、字母、文字、图像、声音、波形等都可以认为是信息,它们可以通过对象进行表达、传递和交换。根据研究数据的形式不同,我们可以把信息分为数值型数据和非数值型数据,除了能够进行计算的数值型数据之外,其他信息都可以看做非数值型数据。这两种数据都可以用逻辑常数“0”“1”进行表示。

逻辑常数表示的是两种条件或状态,单独的“0”“1”是无法表达仸何信息的。我们应该从信息自身的特征进行研究,用“0”“1”有序排列组合的形式,去表示信息的共同特征。比如说运动员,编号是它的信息特征,可以用“0”“1”的排列组合将所有运动员编号表示出来。同理,对于数字电路,信息可以利用输入或输出的稳定电压排列组合来表示,也可以用“0”“1”的排列组合来表示。

1.2.1 数值型数据的逻辑表示

在逻辑问题或数字电路中表达的数值型数据,数据的位数只有“0”“1”两个数字,这到底是一种怎样的表示方法呢?在日常生活中,人们是使用十进制数来表示数值型数据的,因此,我们应从十进制数入手,找出其表示的规律。十进制数是一种表示数值型数据的方法,这种方法称为数制。除了十进制数之外,是否存在其他表示数的方法呢?是否还有其他数制呢?答案是确定的。因此,我们可以把数制推广到仸意的R(R≥2)进制数,研究R进制数的表示方法,找出“0”“1”两个数字表示的数制,实现不同数制之间的转换,研究逻辑常量表达数据的表示形式和运算规则。

1.数制

数制是一种表示数的方法。在日常生活中,人们是以十进制数来表示数据并进行计数与运算的。100个苹果的“100”,10.6元的“10.6”都是十进制数表示的数据,它由整数部分和小数部分组成。对于整数位有n位、小数位有m位的仸意十进制数来说,我们可以把它表示为十进制数据的形式。

(kn-1 kn-2k1 k0.k-1 k-2k-m+1 k-m)10

从所列数据来看,数据的下标10表示该数为十进制数据,该数据主要由ki自高位向低位排列组成,i为位号,i为负数表示该位为小数位,ik称为位或系数,用0~9之间的数表示。

根据十进制数据大小的表示规律,该数据可以展开为乘积和的形式。

上式称为多项式的表示形式,ik为第i位数据的系数,10 i称为第i位对应的权,10为基数,它的指数即为本位的位号,它的大小是指本位系数为1个单位时该位数据的大小。ik × 10 i表示第i位数据的实际大小,它由位与权的乘积计算所得,因此,这种表示数的方法称为位权表示法,是我们书写时经常采用的格式。十进制数加减法计算原则是“逢10进1,不够减向高位借1变10”。

如果把十进制数中的10改为仸意的R,则整数为n位、小数为m位的十进制数则变为R进制数,该数据如下表示:

(kn-1kn-2k1k0.k-1k-2k-m+1k-m)R

仸意R进制的多项式表示形式如下:

体现了位权表示法的含义,对于其中的参数,约定如下。

① 位号与指数:i既是系数(位)对应的位号,也是权对应的指数。i为正整数或 0 时表示的是整数位,为负整数时表示的是小数位。

② 系数(位):ik为第i位系数的大小,系数可以取值的范围应该在0~(R−1)之间。系数最大取值比进制数小1。

③ 权: iR是第i位的系数ki为单位1时,该位的大小,这里称为R进制数的权。

④ 位权表示法:R进制数并列表示的每一位系数,其实际大小是由系数与权的乘积获得,因此称这种表示数据的方法为位权表示法。

⑤ 加减法计算规则:R进制数加法运算的规则为“逢R进一”;减法运算规则为“不够减向高位借1变R”。

根据仸意进制数数据位的取值范围,对于只能用0、1两个数字表示的数制,位的最大值为1,因此进制数应该是1 + 1 = 2,所以用“0”“1”作系数的数制是二进制数。二进制数是逻辑学中表示数值型数据的唯一数制。

【例1.2】对于两个五进制数(334.23)5和(231.04)5,阅读题目要求及实现过程。

(1)指出第1个五进制数的第1和−2位的系数与权,并写出多项式形式,求出十进制数。

① 对于仸意的R进制数,整数部分是从第0位开始自低位向高位算起的,小数部分是从小数位后−1位,依次向右减1位计算。因此,(334.23)5第1位的系数是3,权是51;第−2位的系数是3,权是5−2。系数与权是位权表示法的体现参数。

②根据位权表示法写出(334.23)5的多项式表示形式。

③将(334.23)5转化为十进制数。

只要将②中的多项式按照十进制数的计算方法和逢十进一的原则进行计算,得到的结果就是十进制数。使用这种方法可以把仸意进制数转换为十进制数的形式。在②中52对于五进制数来讲是100,对于十进制数来讲52= 5 ×5 = 25,25即为十进制数据,而五进制数的系数比9小,因此五进制数的系数也是十进制的系数。最后,按照逢十进一原则进行乘法、加法运算,最终得到的结果即为十进制的数。(334.23)5转化为十进制数,计算过程为

因此,(334.23)5转化为十进制数的结果是94.52。

(2)计算两个五进制数的和与差。

根据R进制数加减法运算原则,五进制数的加法原则是逢5进1;减法运算原则是对位相减,不够减则向高位借1变5。以下是(334.23)5和(231.04)5的加、减法运算过程。

① 加法运算。加法所列竖式为

在进行加法运算过程中,自低位向高位逐位相加并逢5进1。首先是最低位3加4为7,大于5,所以向高位逢5进1,余2,即本位和为2,进位为1;然后次低位2加0,再加进位1,得本位和为3,进位为0;依次类推……,最后得到两个五进制数相加的结果为(1120.32)5

② 减法运算。减法所列竖式为

在进行减法运算过程中,自低位向高位逐位相减,如果减数大于被减数,需要被减数向高位借一个1,变成5后加到本位,然后再相减。首先是最低位的被减数3减去减数4,因为不够减,需要向次高位借1变为本位的5,5加3变为十进制数8,用8减去4得到本位差4,同时次高位2减去1后变为1;然后次高位被减数1减去减数0,得到结果1;依次类推……,最后得到两个五进制数相减的结果为(103.14)5

(3)实现两个五进制数的乘法与除法运算。

对于仸意进制数的乘法和除法运算,实现过程并不相同。对于乘法运算而言,使用被乘数和乘数自低位向高位逐位相乘,然后相加的运算方法,相乘过程和相加过程全部采用逢R进1的原则,运算方法与十进制数运算方法相同;R进制数除法的运算方法也和十进制数除法的运算方法相类似,运算过程参考下面对应的除法竖式。

① 乘法运算。省略小数点,乘法所列竖式为

被乘数33423与乘数最低位4相乘,被乘数的最低3与4相乘得十进制数12,然后将12转换为五进制数22,本位和为2,进位为2;然后次低位2与4相乘得十进数8,再与进位2相加,得到十进制数10,将其转换为五进制数为20,本位和为0,进位为2;依次类推……,得到相乘的第一个五进制数300302。被乘数与乘数的每一位相乘后,按顺序和规则列出所有的乘积项,如乘法竖式所列,最后按照五进制数逢五进一的加法原则相加,得出最终的结果。

在进行运算时,我们没有写小数位,被乘数和乘数各有两位小数,因此结果应有4位小数位。乘法运算的结果为(200003.2102)5

②除法运算。去掉小数点,将被除数和除数分别变为(33423)5和(23104)5,则相除的结果保持不变,列式计算两个数的商和余数,计算过程如下:

在进行除法运算的过程中,被除数33423和除数23104的位数相同,直接比较两数大小,除数小于被除数,能够直接相除。五进制数33423大于五进制数23104,小于23104的2倍即五进制数103140;因此最高位商为1,又因整数部分已经除完,1的后面应该有一个小数点;用被除数减去除数,得到五进制余数10314。在10314后添加一个0后,变为被除数,继续除以23104,得到商2和余数1422;在1422后添加一个0,因为不够除,所以商为0,余数不变;再填一个0,被除数变为142200,相除后得到商为3,余数为12323。进行除法运算的过程主要是进行乘法和加法运算,都要及时将运算数据转换为五进制数。该除法运算得到的商为(1.203)5,余数为(0.12323)5

2.常用进位计数制

根据前面所述,我们知道在逻辑过程中,数值型数据只能用二进制数来表示,但是二进制数单位小,表示数据位数较多,因此在其他编辑、编译等非逻辑表示过程中,一般采用与二进制数有特殊转换规律的八进制数、十六进制数及人们习惯使用的十进制数来表示。常用进制数有二进制数、十进制数、八进制数及十六进制数4种。因数制采用位权表示法,所以我们主要掌握每种数制的基(进制数)、系数范围及表示、编辑格式及多项式表示形式。

(1)二进制数

在逻辑问题中,二进制数是能够表示数值型数据的唯一进位计数制。二进制数的基数为2,系数只有0、1两个数字。在编辑时,一般在二进制数后写上字母B作为区别于其他进制数的标志,数字11101.101B表示二进制数11101.101。二进制数的加法运算规则为“逢2进1”。

将二进制数11101.101B展开为多项式的表示形式:

11101.101B = 1 ×24 + 1 ×23 + 1 ×22 + 0 ×21 + 1 ×20 + 1 ×2−1 + 0 ×2−2 + 1 ×2−3

(2)十进制数

十进制数是人们在日常生活中表示数据的通用方法。十进制数的基数为10,系数由0~9间的数字表示。编辑时,在一个数据后写上字母D或不写仸何字母,都表示该数为十进制数据,267.109和267.109D都表示十进制数267.109。十进制数的加法运算规则为“逢10进1”。

将十进制数267.109展开为多项式的表示形式:

267.109 = 2 ×102 + 6 ×101 + 7 ×100 + 1 ×10−1 + 0 ×10−2 + 9 ×10−3

(3)八进制数

八进制数是由二进制数按照一定规则转变而来。八进制数的基数为8,系数由0~7间的数字表示。编辑时,在一个数据后写上字母O来表示该数为八进制数据,237.106O即表示八进制数237.106。八进制数的加法运算规则为“逢8进1”。

将八进制数237.106O展开为多项式的表示形式:

237.106O = 2 ×82 + 3 ×81 + 7 ×80 + 1 ×8−1 + 0 ×8−2 + 6 ×8−3

(4)十六进制数

十六进制数也是由二进制数按照一定规则转变而来。十六进制数的基数为16,系数由0~15间的数字表示,但是10~15无法单独用数字表示,因此我们使用系数A、B、C、D、E、F这六个字母一一对应表示10、11、12、13、14、15这六个数。编辑时,在一个数据后写上字母H来表示该数为十六进制数据,9AB.6FH即为十六进制数。十六进制数的加法运算规则为“逢16进1”。

将十六进制数9A5B.6FH展开为多项式的表示形式:

9A5B.6FH=9×163+10×162+5×161+11×160+6×16-1+15×16-2

3.数制之间的转换

逻辑常数只能表示二进制数,但在编辑和书写过程中,还要使用八进制数、十进制数、十六进制数甚至其他进制的数,这就要考虑各种数制数据之间转换的问题。因为我们最常使用和运用熟练的数制是十进制数,所以首先要考虑的是十进制数和其他仸意进制数之间的转换,包括十进制数转换为仸意进制数,仸意进制数转换为十进制数。以十进制数为中介,可以实现仸意进制数之间的转换,可以把一种仸意进制数转换为十进制数,然后再把所得十进制数转换为另一种仸意进制数。而二进制数和八进制数、十六进制数之间有特殊的转换关系,因此它们之间可以直接转换,而不必通过十进制数为转换中介。

综上所述,数值转换主要包括“仸意进制数转换为十进制数”“十进制数转换为仸意进制数”“仸意进制数之间的相互转换”“八进制数、十六进制数转换为二进制数”“二进制数转换为八进制数、十六进制数”5种情况。

(1)仸意进制数转换为十进制数

只要将位权表示法表示的仸意进制数用多项式的形式表示出来,然后按照十进制数的运算规则运算,得到的结果就是十进制的数据。

【例1.3】将数据(1420.32)5,(9AE6.4F)16,(110111.1011)2分别转换为十进制数。

从实例可以看出,仸意进制数转换为十进制数过程中,无论指数运算,还是乘法、加法运算,都是采用十进制数的运算规则进行的。

(2)十进制数转换为仸意进制数

从例1.3来看,仸意进制数都可以表示为多项式的形式,如果把一进制数表示为另一进制数多项式形式,然后用位权表示法就可以把新的进制数表示出来,完成数制的转化。这种转换方法要根据原数据的大小,找出新数制的所有权值,然后计算出每个权值对应系数即可。由于我们对十进制数比较熟悉,所以这种方法非常适合于十进制数转换为仸意进制的数。

以十进制数115为例,把其转换为五进制的数据。首先,找出最大的权值,由于52<115<53,所以最大权值为 25,又因为52×4=100<115<53,所以该权值对应的系数为4,用115减去100,得到差15,然后分别计算权15和 05的系数分别是3和0,自高位向低位排列,115所转化的五进制数为(430)5

转换过程首先需要判断新数制数据对应的最大权值,然后自高而低计算所有权值对应的系数,并以多项式的形式进行展示。

115=4×52+3×51+0×50

而对于小数部分,则从第−1位系数开始判别,直到判别出所有系数为止,计算过程和整数求解过程相同。将0.712转换为五进制数,以多项式的形式表示。

0.712=3×5-1+2×5-2+4×5-3

所以,0.712 = (0.324)5

【例1.4】将十进制数115.625转换为二进制数。

因为26<115<27,所以二进制数的最大权值为26。自高而低对权和系数进行计算,可以把115写成二进制数的多项式表示形式。

所以,115.625=(1110011.101)2

上述数据根据位权表示法计算所得,但对于较大的数据,这种方法的计算过程就显得比较复杂。

观察数值转换的多项式,可以寻找能够通过计算直接获得系数的方法,这种方法称为基数乘除法。假定要转换的数制为R进制数,则要对十进制数N.M的整数部分N和小数部分0.M分开研究,推导出求各位系数的原理。

① 整数部分。不管十进制数整数部分N是多大,假设N转换为R进制数后位数为n位,系数用 ik表示,则数制转换后的多项式可表示为

式中kn-1kn-2,…,k1k0是转换后R进制数各位的系数。将等式两边分别除以基数R,得到下式:

其中,余数为k0,是转换的R进制数的最低位,商为kn1 ×Rn-2+kn-2×Rn-3+…+k1×R0。把商再除以基数R,可以得到余数k1和新的商,每次给新商除以一次基数R,都可以得到一位新的余数,直到得到最高位为kn−1,商为0为止。所得余数自高而低排列,按照求解顺序则是倒序排列,就可以得到R进制的数据。所以,对于十进制整数,通过对商除以基数R,逐步获得余数,将余数倒序排列的方法,实现十进制数到R进制数的转换,称为基数除法转换法。根据这种方法,把十进制数19转换为二进制数:

根据计算得出19 = (10011)2

② 小数部分。

不管十进数小数部分0.M是多大,假设0.M转换为R进制数后位数为m位,系数用ki表示,则数制转换后的多项式可表示为

将上式两边乘以R,得到下式:

乘以R后,第1位小数k−1变为整数,即求出第1位小数,k−2变为第1位小数,把剩下的小数再乘以R,求出k−2,依次求出所有小数位为止。对于十进制小数数据向R进制数据的转换,采用逐步取小数数据乘R,求出整数,然后将整数按照求出顺序排列,最终得到R进制小数的方法,这种方法称为基数除法转换法。根据这种方法,把十进制数 0.375 转换为二进制数:

根据计算得出 0.375 = (0.011)2

如果小数部分位数是无穷的,要根据要求选择适当的位数。

【例1.5】将235.68转换为五进制数。

①将整数235转换为五进制数,采用基数除法。

②将小数0.68转换为五进制数,采用基数乘法。

通过基数乘除法运算,将十进制数235.68转换为五进制数(1420.32)5。与例1.3作比较,计算的结果是准确的。

(3)仸意进制数之间的相互转换

上述(1)实现了仸意进制数到十进制数的转换,(2)实现了十进制数到仸意进制数之间的转换,所以两种仸意进制数之间的转换,只要把其中一种进制数转换为十进制数,然后再把十进制数转换为另一种进制数即可。

【例1.6】将五进制数(421)5转换为六进制数。

① 将(421)5转换为十进制数。

② 将十进制数转换为六进制数。

所以,(421)5=(303)6

(4)八进制数、十六进制数转换为二进制数

八进制数最大系数7转换为二进制数时可用3位二进制数111表示,为了表示规则一致,表示位数最少,多位八进制数转化为二进制数时,每位系数只能都转换为3位二进制数,而且必须转换为3位二进制数。同理,十六进制数最大系数F(15)转换为二进制数时用4位二进制数1111表示,多位十六进制数的每位系数转换为二进制数时,只能用四位二进制数而且必须用四位二进制数表示。

【例1.7】将(5210.634)8和(5BE2.1C)16转换为二进制数。

根据上述分析,向二进制数转换,八进制数每位系数必须转换为3位二进制数,十六进制数每位系数必须转换为4位二进制数。所以,两个数转换的结果是:

(5)二进制数转换为八进制数、十六进制数

观察例1.7中由八进制数和十六进制数转换为二进制数的结果,每一个系数可以表示为等长度的二进制数。而等长度的二进制数的排列,是以小数为中心,向两侧各取等长度单位的数字实现的。所以,要把二进制数转换为八进制数,只要以小数点为中心,向两侧各取3位,然后把每3位二进制数转换为八进制数即可。同理,将二进制数转换为十六进制数,同样以小数点为中心,向两侧各取4位,然后把每4位二进制数转换为十六进制数即可。在取数过程中,如果位数不够,则填0补足规定位数,然后再进行数制转换。

【例1.8】将二进制数(10101100010.011111)2转换为八进制数、十六进制数。

① 转换为八进制数。

② 转换为十六进制数。

八进制数和十六进制数之间可以通过二进制数为中介进行转换。下式是转换的实例:

4.二进制数的算术运算

在逻辑表达过程中,数值型数据都是用逻辑常数0、1自高位到低位排列而成。按照有无符号,数值型数据包括无符号数和有符号数两种;按照数据存放的格式,数据分为定点纯整数和定点纯小数。我们主要研究无符号数的加、减、乘、除运算,有符号数的定点纯整数或定点纯小数在逻辑中的表示方法、数据格式及范围、有符号数的运算等。

(1)无符号二进制数的算术运算

无符号数是指数值型数据所有系数全为数据,没有正负数的区分。运算规则采用二进制数的运算规则,加法规则为“逢2进1”,减法规则为“不够减向高位借1变2”。计算过程参照前面所述的五进制数的加、减、乘、除运算。

①无符号二进制数的加法。

加法规则为:0+0=0,0+1=1+0= 1,1+1=10。

计算10110和10100的和:

②无符号二进制数的减法。

减法规则为:1 − 0 = 1,1 − 1 = 0,0 − 0 = 0,10 − 1 = 1,其中被减数要大于减数。

计算1010和0101的差:

③无符号二进制数的乘法运算。

计算1011和1010的积:

由上述运算可以看出,乘法运算是由左移被乘数和加法运算组成。

④无符号二进制数的除法运算。

计算1010和111商和余数:

由上述运算过程可见,除法运算由右移被除数与减数运算组成。

(2)有符号二进制数的表示与运算

在日常生活中,数据有相对立的两种表示形式,例如,多栽了98棵树,可以用+98表示;少栽了15棵树,可以用−15表示。因此,数据表示时一般是分为正数和负数的。在编辑过程中,带有正负号的二进制数称为真值,如+1101.11B,−100010.001B。而在逻辑表达过程中,除了用二进制数表示数据之外,还需要用逻辑常数来表示正号和负号,因符号只有“+”“−”两个,逻辑常数只有“0”“1”两个,两者可以一一对应表示,一般把二进制数的最高位作为符号位,“0”表示为正号,“1”表示为负号。

在逻辑表达数值型数据过程中,可将真值表示为有符号数,一般有原码、反码、补码、移码4种表示形式,数据的位数一般是2i(i>2)位,如8、16、32位等。在数字电路中,有符号数一般是用补码来表示的,因此,我们主要讨论补码的加减运算,并进行数据的溢出判别。在数字电路中表示的有符号二进制数,我们也称为机器数。

机器数包括定点纯整数和定点纯小数,对于较大或位数较多的数据,可以用科学计数法表示。科学计数法表示的数据由定点纯整数和定点纯小数复合而成。

① 原码表示法。

用二进制数“0”和“1”分别表示真值X中的“+”和“−”,数据位保持不变,就得到数据真值对应的原码表示。一般用 8 位二进制数作为表示一个数据的最小单位,称为字节(Byte)。二个字节数据称为一个字(Word),两个字称为双字(DWord)。

如果机器数为 8 位定点纯整数,真值X=+ 1011110B,则[X]= 01011110B;如果X=−1011110B,则[X]= 11011110B。

如果机器数为 8 位定点纯小数,X=+0.1011110B,则[X]= 0.1011110B;如果X=−0.1011110B,则[X]= 1.1011110B。

同一真值数X,机器数的位数不同,得到的原码长度不同,则原码就不相同。不管机器数位数是多少位,符号位永进处在最高位。

0是一个特殊实例,8位二进制数+0000000B和−0000000B的原码表示如下:

[+0000000]= 00000000B

[−0000000]= 10000000B

可以看出,0的原码表示有两种,即有重码。

根据原码表示数据的规律,我们可以得到求解原码的定义:

对上述定义来说,X 为二进制数真值,2n称为机器数的模。“模”是指一个计量系统的计数范围。如时钟中的一小时就是60分钟,这个60分钟就是“模”。“模”实质上是计量器计满数后产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。因此,对于n位定点纯整数来说,它的模是2n;而对于定点纯小数而言,可以把定点纯小数看做定点纯整数,它的模也是2n,求出原码后,再转换为定点纯小数。也可以求定点纯小数的溢出量21,则n为1。

【例1.9】用原码定义求二进制数+1001101B和−0.110110B的8位原码。

因为真值+1001101为正数,所以使用定义[X]= 2n+X求原码。则:

[+1001101B]= 28 + 1001101 = 100000000 + 1001101 = 101001101B

计算的结果是9位,而机器数是8位,第9位数据自动舍弃。所以,计算的结果为

[+1001101B]= 01001101B

而真值−0.110110B为负数,包括符号位在内不足8位,应该在末尾填一个0,然后把8位小数看做8位整数−1101100B,使用定义[X]= 2n−1 +|X|计算其对应的原码。

[+1001101B]= 27 +|−1101100B|= 10000000 + 1101100 = 11101100B

将其转换回定点纯小数。

[+0.1001101B]= 1.1101100B

也可以使用定点纯小数的模来计算,此时n=1,则:

[+0.1001101B]= 21−1 +|−0.1101100B|= 1.0000000 + 0.1101100 = 1.1101100B

对于定点纯小数,两种计算方法所得结果是相同的,对模的理解要从溢出数据的角度考虑。

②反码表示法。

反码也是表示有符号二进制数的一种机器数,不管是定点纯小数还是定点纯整数,都可以看做定点纯整数,如果机器数的位数为n,真值数为X,2n为机器数的模,则X反码的定义根据正负数的不同而不同,其定义如下:

从定义来看,对于正数来说,反码的定义和原码是相同的,所以,反码就是原码。而对于负数来说,需要根据定义[X]反 = 2n+ X − 1 计算得出反码。试根据定义求二进制数−1001B的8位反码。

[−1001B]= 100000000 − 1001 − 1 = 11110110B

【例1.10】求二进制数−0.1001B的8位反码。

方法一:以整数的方法求反码。

因小数位只有4位,应该在末尾补3个0,符号位1位,是最低整数位,则可把−0.1001B看做8位整数−1001000B,利用公式[X]= 2n+X− 1计算得出反码。

[−1001000B]= 100000000 − 1001000 − 1 = 10110111B

把所求的结果转换为小数的反码。

[−0.1001B]= 1.0110111B

方法二:以小数的方法求反码。

以小数方法求反码,模是21,公式[X]= 21 +X− 1中减去的1,是指在小数最末尾减去1,如果小数位为m位,则该位1的大小是2m。利用该公式求出反码。

[−0.1001B]= 21 − 0.1001 − 1 = 10.0000000 − 0.1001000 − 0.0000001 = 1.0110111B

通过定义法计算出的反码,我们通过观察,可以得出直接计算的规律。

● 对于正数,反码等于原码。

● 对于负数,在原码的基础上,符号位不变,其他位取反。

二进制纯小数−0.1001B的8位原码是1.1001000B,符号位不变,其他位取反,得到数据为1.0110111B,这与我们根据定义得到的结果是一致的。

③ 补码表示法。

补码是表示有符号数中最常用的一种机器数。用补码表示带符号的二进制数时,符号位与原码、反码相同,即用0表示正,用1表示负;数值位与符号位相关,正数补码的数值位与原码、反码相同。而负数补码的数值位是真值的数值位按位变反,并在最低位加 1。根据其运算规律,对于二进制数真值X,补码的定义表示如下:

[X]=2n+X

在上式中,2n是数据的模,忽略定点纯小数的小数点,则n可以看做机器数的位数,根据定义计算出补码后,再转换回定点纯小数。如果以小数的方式计算,则模对应的溢出值是21

对于正数而言,原码、反码、补码定义是相同的,因此原码、反码、补码都等于原码,我们求出原码即可。而对于负数,补码的定义比反码的定义少一个末位1,我们只要在反码机器数末位加一个1,就会得到负数的补码。

【例1.11】用定义法和直接转换法两种方法求二进制数−0110110B与−0.01011B的8位补码。

步骤1:求整数−0110110B的补码。

根据定义[X]=2n+X求补码,将n= 8,X=−0110110B代入公式中。

[-0110110B]=28-0110110=100000000-0110110=11001010B

也可以直接进行计算,先求出原码,再转变为反码,最后在末位加1。

[−0110110B]= 10110110B

[−0110110B]= 11001001B

[−0110110B]= [−0110110B]+ 1 = 11001001 + 1 = 11001010B

两种方法计算的结果是完全相同的。

步骤2:求小数−0.01011B的补码。

首先使用定点纯小数求补码的定义[X]=21+X求−0.01011B的补码。

[-0.01011B]=21-0.01011=10.0000000-0.0101100=1.1010100B

接着用整数的定义求补码,将小数−0.01011B看做整数−0101100B,利用定义[X] 28= + X

求出补码。

[0101100B]28= -0101100=1000000000101100=11010100B

将整数的补码转换为小数的补码。

[0.01011B]=1.1010100B

最后使用直接计算的方法求小数−0.01011B的补码。

[−0.01011B]= 1.0101100B

[−0.01011B]= 1.1010011B

[−0.01011B]= [−0.01011B]+ 1 = 1.1010011 + 0.0000001 = 1.1010100B

三种方法所求结果完全相同。

④移码表示法。

移码,又叫增码,是符号位取反的补码,一般用做浮点数的补码,引入的目的是为了保证浮点数的机器零为全0。

如果机器数为n位,则移码的定义为

[X]=2n-1+X

根据移码、补码定义,求二进制数−1011010B的8位移码、补码。

[−1011010B]= 28−1 − 1011010 = 10000000 − 1011010 = 00100110B

[−1011010B]= 28 − 1011010 = 100000000 − 1011010 = 10100110B

比较−1011010B移码与补码的数据,发现两者除了符号位相反外,数据位是完全相同的。所以说移码是一种补码。

而对于移码来说,+0和−0的移码是相同的,都是10000000B,使0的有符号数据表示具有了唯一性。

在移码进行加减运算的过程中,因为其符号位参与2次运算后变为补码的符号,需要对符号位进行修正,才能获得移码表示的符号位,其方法只要将结果的符号位变反即可。

⑤机器数表示的数据范围。

用逻辑常数表示的有符号数,它们的位数是有限的,它们所表示的数据大小也在一定的范围之内。这里假定定点纯小数和定点纯整数的位数都是n位,则计算数据范围的方法并不相同。

原码与反码是从真值数转换而来,它们的范围就是n位真值数表示的范围。对于n位定点纯整数表示的真值数,它的最大数是除正号外数字位全为1的数。该位数据的大小为2n−1−1,计算方法是在最末位加1后,得到和为2n−1,然后再减去加上的1,就得到最大的数;而最小的数是负数,是真值数的数据位全为1的数,它的数据大小也是2n−1−1,因此最小数是-(2n-1-1)。所以,对于n位定点纯整数,它的原码和反码表示的数据范围是[-(2n-1-1),2n−1−1]。

对于n位定点纯小数,小数位为n−1位数据,因此,其最大数据是数据位全为1的正数,在最末位加1(2−(n−1))后,得到的结果是1,用1减掉加上的数据2−(n−1),得到的数据1−2−(n−1)就是最大的数值。因此,对于n位定点纯小数,它的原码和反码表示的范围为[−(1−2−(n−1)),1−2−(n−1)]。

而补码与移码的符号位可以参与运算,对于负数而言,符号位可以单独表示一个数字1,因此它的范围应该比原码、反码多了一个临界的最小数−2n−1(针对定点纯整数而言)。因此,n位定点纯整数补码表示的数据范围是[−2n−1,2n−1−1],而n位定点纯小数补码表示的数据范围是[−1,1−2−(n−1)]。

⑥ 二进制数补码的加减运算及溢出判别。

在数字电路,特别是在微型计算机中,有符号数的加减运算一般都是采用补码运算的。采用补码进行运算,符号位也参与运算,因此无须考虑符号位的变化情况。

假设有两个二进制真值数XY,要计算它们在逻辑过程中进行加、减运算的补码数据结果。要实现该计算过程,真值数首先要进入逻辑表达过程,在逻辑过程中的数据是补码表示的,这两个真值数会自动转换为补码表示的数据,得到[X]和[Y]。因此,我们要求[X+Y]和[XY]补,就得找出它们和[X]、[Y]之间的关系式。

通过分别对定点纯整数和定点纯小数补码运算进行分析和证明,我们可以得到如下的关系表达式:

[X+Y]= [X]+ [Y]

[XY]= [X+ (−Y)]= [X]+ [−Y]

【例1.12】X = 56,Y = −61,设机器数为8位,求[X + Y]和[XY]

分析:提供的数据是十进制数,需转换为8位二进制数,然后将两个二进制数送入逻辑过程,自动转换为8位补码,最后按照公式实现求补码的过程。所以,直接求和、差再求补码的方法,不符合逻辑计算的过程,先计算XY及−Y的补码,然后代入公式中进行计算,才和逻辑计算过程相当。

根据十进制数向二进制数的转换过程,X = 56的二进制数是+0111000B,Y = −61的二进制数是−0111101B。分别求56,−61,61的补码。

[X]= [56]= 00111000B

[Y]= [−61]= 11000011B

[−Y]= [61]= 00111101B

将数据代入表达式中:

[X+Y]= [X]+ [Y]= 00111000 + 11000011 = 11111011B

[XY]= [X]+ [−Y]= 00111000 + 00111101B = 01110101B

对于上述运算过程,因为计算出的结果位数只能是n位,所以同符号数相加,异符号数相减,得到的结果都有可能达到 n + 1 位,这称为溢出。产生溢出的数据运算,对于实际工作过程毫无意义。因此,在进行补码运算的过程中,我们需要对溢出进行判断。

根据研究,我们得出了溢出发生时存在的条件,就是“最高两位产生的进位如果不相同,则发生溢出现象”。例如,对于8位数据的补码00111000B(56)和01001001B(73)进行补码加法运算,产生的数据超过了127,所以数据发生了溢出现象。通过列竖式可以得到运算过程和进位情况,如下所示:

观察所列竖式,最高两位产生的进位为01,所以这两个补码数相加,产生溢出现象。

⑦浮点机器数的表示与运算。

在逻辑表达中,数值型数据只能用定点纯整数和定点纯小数表示,而对于浮点数数据,我们将如何表示呢?与十进制数的浮点数表示方法相比较,二进制数对应的浮点数也可以采用科学计数法来表示,表示形式如下:

M 2N×

上式中的M称为尾数,是二进制数表示的定点纯小数,以补码形式表示,定点纯小数采用双符号位;N称为阶码,是定点纯整数表示的移码。表示数据时,双符号位在前,阶码和尾数依次排列在后面,数据格式为

某浮点数−0.1010B ×211表示的浮点二进制数为16位,其中双符号位为2位二进制数11B,阶码为7位,采用移码表示;尾数为7位,为定点纯小数,采用补码计算所得,则:阶码采用移码表示:[11]移= 1001011B。

尾数采用补码表示:[−0.1010]尾数= 0110000B。

该浮点数的机器数表示:11 1001011 0110000B。

浮点数的加、减运算过程一般是先进行对阶运算,再把尾数相加减,然后进行数据规格化。而乘除法运算一般先进行阶码加减运算,再进行尾数的补码乘除法运算,然后重新规格化。

1.2.2 非数值型数据的逻辑表示

在数值型数据的表示过程中,无符号数是采用二进制数的位权表示法来表示的,没有明确位数多少的规定。而有符号数除了要约定数据的位数和进制数的位权表示法之外,还要指出符号位与二进制数的一一对应关系。这种对数据位数、数据组成规则作出明确约定的二进制表示形式,称为编码。原码、反码、补码、移码都可以认为是一种编码。

1.编码及编码方法

除了数值型数据之外,其他数据都是非数值型数据,比如一个苹果的照片、发出的声音、键盘的字符、文字等。它们在逻辑表达过程中,要对同类同时出现的信息属性统一进行编码。首先分析同类信息中有多少种不同属性的数据,这些属性可能是控制的条件、反映的状态以及实际的二进制数等,根据每种属性的不同数量确定属性的编码位数。如果某类信息的某种共同属性有N个条件,我们需要n位二进制数来表示它,即对其编码,则Nn应该满足如下条件:

2n-1N≤2n

将所有属性对应的编码按一定顺序进行排列,得到的就是整类信息对应的编码。在编码中,寻找所有共同属性的二进制数的编排规则,即编码方法,这是最为重要的。

【例1.13】某地区7所中学举行联合运动会,要求所有学校最多派出15名运动员,请用逻辑常量对运动员进行编码。

分析:确定编码的对象为参加比赛的运动员,目标是对运动员进行编码(编号)。进行编码时,首先要指出运动员属于哪所学校,然后指出运动员是这所学校的第几个运动员,“所在学校”和“本校编号”就是该信息的两种属性。所以对所有运动员进行编码,就是对所有学校和每个学校的所有学生进行编码。因为运动员隶属于某所学校,所以一般把学校编码置于运动员编码之前,则组合的编码格式为

根据上述分析,我们对运动员进行编码,首先要计算出学校编码和运动员编码的位数,然后确定两种编码的数字,最后指出编码如何实现。

(1)计算各种属性编码位数

① 学校编码位数计算。

学校属性是指“运动员属于哪所学校”,应该为每一所学校指定一个编码数字,作为识别的标志。N = 7为参加运动会学校的总数,设学校编码位数为n1,则22= 4< 12n≤23= 8,n1= 3,即至少需要使用3位二进制数来表示运动员所在的学校,而且只能使用3位二进制数表示。能使用3位而不使用更多的二进制数,是为了不增加逻辑问题的复杂性。

② 运动员编码位数计算。

运动员属性是以所有学校最大运动员数量为前提进行属性设置的,运动员的最大数量为15,即编码数量N = 15,设其编码位数为n2,则23= 8< 22n ≤24= 16,n2= 4,应使用4位二进制数为每所学校所有运动员编码。

(2)为各种编码分配数字

学校编码为3位,共有000~111八组二进制数字,而学校只有7所,从其中选择仸意7组二进制数分别指定给这7所学校,共有 78C 8= 种配置方法。这里我们取数字000~110,按照自然顺序编码指定给这7所学校。同理,运动员编码为4位,共有15名运动员,则在0000~1111中仸取15组数字一一对应指定给这些运动员,共有种取法,同样采用自然顺序编码。这些自然顺序码都是从0开始编码的。

(3)编码实现

在为每所学校指定编码数字后,只要知道运动员在本校的编号,运动员的编码数字就被确定下来,编码即被实现。例如,某运动员的编码是101 1100B,表示该运动员是第5所学校的第12名运动员。

2.常用编码

在逻辑表达过程中,常用的编码有:将十进制系数表示为二进制数的二—十进制编码,键盘上所有字符对应的编码——ASCII码,用于电路化简的编码——格雷码等。

(1)二—十进制编码

十进制数是日常生活中常用的数制,在逻辑表达过程中,要对十进数进行表示,就是对0~9之间的10个系数统一进行二进制编码。根据编码规则,10个十进制系数需要4位二进制数对其编码。这种把1位十进数系数转换为4位二进制数表示的编码,称为二—十进制编码,简称BCD(Binary Coded Decimal)码。

4位二进制数共有16种组合,可以从中选择10个编码来表示十进制数的十个系数,根据不同的编码规则,选择的10组编码也不相同。对于经常使用的BCD编码,主要包括有权码和无权码。有权码是指采用位权表示法表示的二—十进制编码,十进制系数可以通过位权表示法计算出来;而无权码的二进制数大小和十进制系数并没有直接的计算关系,是通过编码规则表达的。

有权码主要有8421码、2421码、5421码,名称中的每位数字即为对应位的权值。8421码又称为自然顺序码,它选择4位二进制数的前10组编码0000~1001,按顺序分别指定给十进制系数0~9。2421码和5421码最高位的权分别为2和5,代替了8421码的8,0~4对应的编码最高位系数为0,5~9对应的编码最高位的系数为1。

无权码主要有余3码和余3循环码,全部二进制编码代表一定的含义,但每一位并不表示本位的权值。余3码由8421码加0011得到;余3循环码特点是仸何相邻的两个码字,仅有一位二进制位不同,其他位相同,它是余3码的重新排列。

表1-3列举了常用的几种二—十进制编码,从表中可以看到5种编码的情况。

表1-3 几种常用的BCD码

(2)格雷码

格雷(GRAY)码是相对于自然顺序码而言的,按照一定的规则,针对自然顺序码求出的两个相邻格雷码,仅有1位二进制数字不同。相邻格雷码只有1位二进制数不同,是一种电路设计中简化电路的方法,称为相邻性。相邻编码不同数字的位数称为码距,格雷码的码距为1。在以编码方式传递数据的过程中,相邻的编码码距越小,避免错误编码出错的概率越低。

要通过自然顺序码求出格雷码,首先要了解异或运算的定义和运算方法。当决定事件(F)的条件A、B不同时,事件(F)才发生,这种逻辑运算称为异或运算。异或运算的表达式为

F = A⊕B

在式中,A、B是异或运算的两个条件变量,F是逻辑结果,⊕是异或运算符。根据异或运算的定义,异或运算的运算规则如下:

0⊕0 = 0; 0⊕1 = 1⊕0 = 1; 1⊕1 = 0

根据自然顺序码和格雷码之间的逻辑关系,我们通过逻辑设计可以得出求格雷码的公式。设某n位自然顺序码为Bn1Bn-2…B2B1B0,其对应的格雷码为Gn1Gn-2…G2G1G0,则求格雷码的公式是:

【例1.14】求5位自然顺序码10110B的格雷码。

设5位自然顺序码为B4B3B2B1B0= 10110,格雷码为G4G3G2G1G0,根据求格雷码的公式,列出下列求解过程:

所以,所求5位格雷码为11101B。

根据以上规则,可以得到表1-4所示的3位自然顺序码转格雷码的转换表。

表1-4 3位自然顺序码转格雷码表

如果已知格雷码,我们也可求出对应的自然顺序码。设n位格雷码为Gn1Gn-2…G2G1G0,所求自然顺序码为Bn1Bn-2…B2B1B0,根据它们之间的逻辑关系,通过逻辑设计,可以得到求自然顺序码的公式。

【例1.15】求5位格雷码11101B对应的自然顺序码。

设5位格雷码为G4G3G2G1G0 = 11101,所求5位自然顺序码是B4B3B2B1B0,根据格雷码转换自然顺序码的公式,计算过程如下:

所以,所求5位自然顺序码是10110B,和例1.14给出的5位自然顺序码是相同的,这证明了自然顺序码和格雷码之间相互转换关系是正确的。

(3)ASCII码

计算机是典型的数字电路系统,常用的字符通过键盘输入计算机中,为了便于识别,需要对键盘上的128个字符统一编码。根据编码规则,27 = 128,共需要7位二进制数b6b5b4b3b2b1b0对其进行编码,这128组二进制数表示十进制数数字字符、英文大小写字母、控制符、运算符及特殊符号等,这种编码称为美国标准信息交换码(American Standard Code for Information Interchange),简称ASCII码。ASCII码30H~39H代表数字字符“0~9”;ASCII码41H~5AH代表大写字母“A~Z”;ASCII码61H~7AH代表小写字母“a~z”;“0A”代表换行符;OD代表回车符等。表1-5列出了所有ASCII码编码值及其对应的符号,而表1-6列出了一些字符表示的具体含义。

表1-5 ASCII码表

表1-6 ASCII码对应字符的含义

续表