电路第一章.docx
《电路第一章.docx》由会员分享,可在线阅读,更多相关《电路第一章.docx(36页珍藏版)》请在冰豆网上搜索。
电路第一章
第一章数据信息的二进制表示
数字系统是对数字量进行加工、处理的系统。
目前数字系统中广泛采用二进制信号(也称二值量、开关量),即每个信号只可有两种状态(常用0和1表示)。
这种二进制信号很容易和电路状态对应,且技术实现方便。
一位二进制信号只能表示两种状态,多位二进制信号组合可表示多种状态。
任何信息都必须表示成二进制形式才能用数字系统处理。
本章讨论数字、字符等常用信息的二进制表示。
1.1进位记数制
1.1.1进位记数制的基本概念
进位记数制是指按一定的规则和符号表示数量的方法,其基本要素是数码、位权和运算规则。
我们熟悉的十进制数是以10为基数的记数制,所用的数码是0,1,…,9,各数位的位权是10的整次幂,运算规则是“逢十进一”、“借一当十”。
例如十进制数368.25从左边(高位)开始各位的位权依次为102,101,100,10-1,10-2,这个十进制数所表示的数量可以写成
(368.25)10=3×102+6×101+8×100+2×10-1+5×10-2
一般十进制数N=dndn-1…d0.d--1…d--m所表示的数量可写作
(N)10=dn×10n+dn-1×10n-1+…+d0×100+d1×10-1+…+d-m×10-m
(1.1—1)
上式称为位权展开式,其中di∈{0,1,…,9},m和n都是正整数。
由十进制记数制可以推知一般的R进制记数制就是以R为基数的记数制,采用的数码应是0,1,…,R-1,各数位的位权应是R的整次幂,运算规则应是“逢R进一”,其位权展开式为
(1.1—2)
其中qi∈{0,1,…,R-1},m和n都是正整数。
1.1.2数字系统中的常用数制
数字系统中普遍采用二进制,而在人工读写时常用八进制和十六进制,为便于人机交换也使用十进制,但都是以二进制为基础的。
1.二进制记数制
二进制(binary)记数制是以2为基数的记数制,所用的数码为0和1,各数位的位权是2的整次幂,运算规则是“逢二进一”,其位权展开式为
(1.1—3)
其中qi∈{0,1},m和n都是正整数。
例如二进制数11010.01所表示的数量可以写作
(11010.01)2=1×24+1×23+0×22+1×21+0×20+0×2-1+1×2-2
=24+23+21+2-2
二进制数的运算过程如下
由11111111+1=100000000=28可知,8位二进制无符号正整数所能表示的数值范围为0~255。
n位二进制无符号正整数所能表示的数值范围为0~2n-1。
2.八进制记数制
八进制(octal)记数制是以8为基数的记数制,所用的数码为0,1,…,7,各数位的位权是8的整次幂,运算规则是“逢八进一”,其位权展开式为
(1.1—4)
其中qi∈{0,1,…,7},m和n都是正整数。
例如八进制数350.2所表示的数量可以写作
(350.2)8=32×8+5×81+0×80+2×8-1
八进制数的运算过程如下
n位八进制无符号正整数所能表示的数值范围为0~8n-1。
3.十六进制记数制
十六进制记数制是以16为基数的记数制,所用的数码为0,1,…,9和A,B,C,D,E,F,其中A,B,C,D,E,F所表示的数量分别是10,11,12,13,14,15,各数位的位权是16的整次幂,运算规则是“逢十六进一”,其位权展开式为
(1.1—5)
其中qi∈{0,1,…,9,A,B,C,D,E,F},m和n是正整数。
例如十六进制数E8.4所表示的数量可以写作
(E8.4)16=E×161+8×160+4×16-1=14×161+8×160+4×16-1
十六进制数的运算过程如下
由16n-1=100…0-1=FF…F可知,n位十六进制无符号正整数所能表示的数值范围为0~16n-1。
4.不同数制的标识
在同时使用不同数制的场合,为避免混淆常使用数字下标或字母后缀对不同数制加以标识,如下所示
数制下标标识后缀标识
二进制(Binary)(n)2nB
八进制(Octal)(n)8nQ
十进制(Decimal)(n)10nD
十六进制(Hexadecimal)(n)16nH
1.1.3不同数制的相互转换
1.任意进制数转为十进制数
任意进制数转为十进制数一般采用按权相加法,就是按十进制数的运算规则计算其位权展开式,就可得到相应的十进制数。
例如
(11101000.01)2=27+26+25+23+2-2=(232.25)10
(350.2)8=3×82+5×81+2×8-1=(232.25)10
(E8.4)16=14×161+8×160+4×16-1=(232.25)10
2.十进制数转为其它进制数
要把十进制数转为其它进制数需对其整数部分和小数部分分别进行不同的处理。
十进制整数的转换可采用除基取余法。
就是用所要转成数制的基数连续除十进制整数,直到商为0,将所得一系列余数按先得为低位,后得为高位的顺序排列起来即为所要转换数制的数。
例如
求(232)10=(?
)2(74)10=(?
)2
(232)10=(?
)8(232)10=(?
)16
转换计算过程(除基取余)如下
即(232)10=(11101000)2(74)10=(1001010)2
即(232)10=(350)8(232)10=(E8)16
十进制小数的转换可采用乘基取整法。
就是用要转成数制的基数连续乘十进制小数,直到十进制小数为0或达到要求的转换位数,将所得一系列整数按先得为高位,后得为低位的顺序排列起来即为所要转换数制的小数。
注意十进制小数转换成其它进制数仍然是小数。
例如
求(0.25)10=(?
)2
(0.6875)10=(?
)2
(0.3125)10=(?
)8
(0.25)10=(?
)16
转换计算过程(乘基取整)如下
即(0.25)10=(0.01)2(0.6875)10=(0.1011)2
整数小数
25×16
40
即(0.3125)10=(0.24)8(0.25)10=(0.4)16
一般来说连续乘2、8或16难以使十进制小数达到0,这时可按“精度相当”原则确定转换位数。
例如一位十进制小数表示数的精度为十分之一,转为二进制小数要得到相应精度可取三位或四位(精度为八分之一或十六分之一);两位十进制小数表示数的精度为百分之一,相应的二进制小数可取六位或七位(精度为64分之一或128分之一)。
对既有整数又有小数的十进制数,转换时需分别处理。
例如
(232.25)10=(232)10+(0.25)10=(11101000)2+(0.01)2
=(11101000.01)2
3.二进制数和八进制数、十六进制数的相互转换
由于一位八进制数对应三位二进制数(见表1.1—1),一位十六进制数对应四位二进制数(见表1.1—2),二进制数和八进制数、十六进制数的相互转换非常方便。
表1.1—1八进制数和二进制数的对应关系
八进制
0
1
2
3
4
5
6
7
二进制
000
001
010
011
100
101
110
111
表1.1—2十六进制数和二进制数的对应关系
十六进制
0
1
2
3
4
5
6
7
二进制
0000
0001
0010
0011
0100
0101
0110
0111
十六进制
8
9
A
B
C
D
E
F
二进制
1000
1001
1010
1011
1100
1101
1110
1111
要把八进制数转为二进制数,只需将每位八进制数写成相应的三位二进制数即可;要把十六进制数转为二进制数,只需将每位十六进制数写成相应的四位二进制数即可。
例如求(56.73)8=(?
)2,(6A.D3)16=(?
)2
则(56.73)8=(101110.111011)2
(6A.D3)16=(01101010.11010011)2
把二进制数转为八进制数或十六进制数,需要以小数点为基准进行分组,转为八进制数时每三位一组,转为十六进制数时每四位一组,位数不足时需用0补位(补位应不改变原二进制数的数值,即整数在高位补0,小数在低位补0);按原顺序写出每组二进制数所对应的八进制数或十六进制数即可。
例如求(1011101.01011)2=(?
)8,(1011101.01111)2=(?
)16
则(001011101.010110)2=(135.26)8
(01011101.01111000)2=(5D.78)16
4.八进制数和十六进制数的相互转换
八进制数和十六进制数的相互转换可通过二进制数实现。
如要将一个八进制数转为十六进制数,可先将其转为二进制数,再将此二进制数转为十六进制数。
例如(45.6)8=(00100101.1100)8=(25.C)16
(7A9.D)1616=(011110101001.110100)2=(3651.64)8
1.2带符号的二进制数的表示
数字系统中所表示的数可能是正数,也可能是负数;可以是纯整数,称为定点整数;也可以是纯小数,称为定点小数;也可以既有整数,也有小数,称为浮点数。
浮点数将在1.3节讨论,本节讨论定点数。
1.2.1真值和机器数
带符号的数是用正负号加绝对值表示的数。
真值是指带正负号的二进制数,是带符号的二进制数的书写形式。
在数字系统中“数”是用寄存器、存储器等硬件设备来表示的,其位数是固定的,即无效0也要表示,如无符号二进制数11011,在8位字长的机器中表示为00011011(8位二进制数)。
数的正负号通常是用位于数码最高位(最左端)的一个二进制位表示,这个二进制位叫作符号位,一般是0表示正,1表示负。
这种用一个二进制位表示数的正负号的方法称为符号数码化。
机器数是符号数码化的定长二进制数,是带正负号的二进制数在机器中的表示形式。
例如+4和-4写成二进制数(真值)分别为+100和-100,表示成8位字长的原码(机器数)分别为00000100和10000100,两机器数的最高位是符号位,0表示“+”,1表示“-”。
注意:
由于机器数的位数是固定的,当实际数的有效数位不足时需要用0补位。
常用的机器数有原码,补码和反码。
1.2.2原码(truefrom)
原码又叫符号—数值(sign-magnitude)表示法,是用一个二进制位(称为符号位)表示数的正负号,其余各位(称为数值部分)表示数的绝对值。
n位定点整数原码形式为
xn
xn-1
…
x1
n位定点整数原码的定义式为(符号位的位权为2n-1)
(1.2—1)
式中[x]原表示真值x的原码。
当x为正数时[x]原=x,即正数的原码的符号位为0,数值部分等于真值(若真值的有效数位不足时需用0补位);当x为负数时[x]原=2n-1+∣x∣,即负数的原码的符号位为1(符号位的位权为2n-1),数值部分等于真值的绝对值(需补位定长)。
按定义可以写出n位定点整数原码所能表示的数值如下
正数
真值原码
负数
真值原码
+100…01
……
+(2n-1-1)01…11
-110…01
……
-(2n-1-1)11…11
可以看出,n位定点整数原码所能表示的数值范围为-(2n-1-1)~+(2n-1-1)。
原码和真值的转换可以按原码的符号位对应真值的正负号,原码的数值部分等于真值的绝对值(需补位定长)来完成。
例如若x=10110,y=-10110按8位字长
则[x]原=00010110,[y]原=10010110
0的原码有两种形式[+0]原=00…0,[-0]原=10…0
n位定点小数原码形式为
xn
xn-1
…
x1
n位定点小数原码的定义式为(符号位的位权为20)
(1.2—2)
机器表示定点小数时小数点是隐含的,并不表示出来。
但我们在书写时为明确起见常把小数点写出来。
例如若有x=0.1101,y=-0.1101按8位字长
则[x]原=0.1101000,[y]原=1.1101000
原码具有符号和数值分离的特点,形式直观易于理解。
但运算不便,例如对两个原码表示的数做相加运算,需先检查两数的符号位,若同号则两数的数值部分相加;若异号则需将两数的数值部分相减。
数字系统较少采用原码。
1.2.3补码(two’scomplement)
补码是按模定义的一种表示带符号的二进制数的方法,由于补码运算方便,在数字系统中得到了广泛应用。
1.补码的定义
用来记数的设备所能表示的数总有一个限度,或者说有一定的容量,这个容量我们就称之为模。
例如指针式钟表的小时记数,在表盘上有12个刻度,可表示12种状态或记12个数,我们就称其为以12为模。
对钟表的小时记数来说,12和0的指示相同;另外如果指针原指在2的刻度上,将其顺时针方向拨过(加)12个刻度,指针仍然指在2的刻度上。
上述情况可表示为
12=0(mod12)
2+12=2(mod12)
其中mod12表示以12为模。
一般说来若记数设备以m为模,则有
m=0(modm)
a+km=a(modm)(1.2—3)
其中k是整数。
对钟表来说,如果将指针由2的位置逆时针拨过(减)9个刻度,则指针指向5;而将指针由2的位置顺时针拨过(加)3个刻度,指针也指向5。
即
2-9=2+3=5(mod12)
按式(1.2-3)上式也可写成
2-9=2+(12-9)=2+3(mod12)
我们称数与模的和为该数对模的补数。
如-9对模12的补数为3,-5对模12的补数为7,+3对模12的补数为3。
这样,减法操作可由加负数对模的补数来实现。
n位二进制整数共有2n种状态,可表示2n个数(0~2n–1),而0和2n的n位二进制表示是相同的,
xn
xn-1
…
x1
00…00
100…02n
即n位二进制整数是以2n为模。
对n位二进制整数有
2n=0(mod2n)
a+k×2n=a(mod2n)(1.2-4)
其中k是整数。
定义:
二进制数与模的和为二进制数的补码。
即
[x]补=2n+x(mod2n)(1.2—5)
根据模的特点,n位定点整数补码的定义式也可写成
(1.2—6)
式中[x]补表示真值x的补码。
例如按8位字长
[+100]补=00000100
[-100]补=28-100=11111100
[+110100]补=00110100
[-1]补=28-1=11111111
[-27]补=28-27=27=10000000
[+0]补=00000000
[-0]补=28-0=28=00000000
即0的补码形式唯一。
为使补码能够正确地表示数值并能区分真值的正负,可将补码的最高位为作为符号位,0表示正,1表示负。
这样可以写出n位定点整数补码所能表示的数为
正数
真值补码
负数
真值补码
+100…01
+200…10
……
+(2n-1-1)01…11
-111…11
-211…10
……
-(2n-1-1)10…01
-2n-110…00
即n位定点整数补码所能表示的数值范围为-2n-1~+(2n-1-1)。
其中-2n-1是n位定点整数补码所能表示的绝对值最大的负数,常作为特殊数,后面所要讨论的简便转换方法对此数不适用。
把补码本身(连同符号位)作为二进制数,其数值叫做补码的码值。
补码的码值和真值的关系可用数轴表示如图1.2-1
显然若两数同号时,真值大的数其补码的码值也大;若两数异号时,真值大的数其补码的码值小。
2.补码与真值的相互转换
①由真值求补码
由定义式可以求出真值的补码。
例如按8位字长写出下列各数的补码
x1=+101100x2=+11010
x3=-101100x4=-11010
由定义式(1.2-6)
[x1]补=00101100[x2]补=00011010
[x3]补=28+x3=100000000-101100=11010100
[x4]补=28+x4=100000000-11010=11100110
直接按定义式求正数的补码只需做补位定长,可以直接写出;直接按定义式求负数的补码,需要做二进制减法运算,不太方便。
下面推导求负数的补码的简便方法
对n位字长,设x=-xn-1xn-2…x1为n-1位数值,则由定义式
[x]补=2n+x=100…0-xn-1xn-2…x1
=11…1+1-xn-1xn-2…x1
=1(1-xn-1)(1-xn-2)…(1-x1)+1
=
(1.2-7)
其中1-xi的结果与xi相反,用
表示,其中字符上面的“—”称为“取反”,即
当xi=0时,1-xi=
=1;当xi=1时,1-xi=
=0。
式(1.2-7)说明负数的补码符号位为1,数值部分可由真值的数值部分按位取反,末位加1得到。
注意在做上述操作之前需先将真值的数值部分补位至n-1位。
按位取反,末位加1(简称取反加1)的操作称之为求补操作。
例如若x3=-101100x4=-11010按8位字长
则[x3]补=[-0101100]补=11010011+1=11010100
[x4]补=[-0011010]补=11100101+1=11100110
经观察可知,求补操作也可以按“保持低位的0以及首1(由低位到高位出现的第一个1)不变,首1之后的各位按位取反”的方法完成。
例如按8位字长
x3=-0101100x4=-0011010
取反不变取反不变
[x3]补=11010100[x4]补=11100110
注意:
上述求负数的补码的简便方法不适用于特殊数-2n-1(n位定点整数补码能表示的绝对值最大的负数),其补码可直接由定义式得出
[-2n-1]补=2n-2n-1=2n-1=10…0
例如按8位字长,[-10000000]补=[-27]补=28-27=27=10000000
由真值求补码的方法可概括为:
先将真值的数值部分补位定长,对于正数,其补码的符号位为0,数值部分等于真值的数值部分(以后简称为数值不变);对于负数,其补码的符号位为1,数值部分由真值的数值部分求补得到(以后简称为数值求补)。
定点小数的小数点隐含在最高位(符号位)之后。
n位定点小数补码的定义式可写成
(1.2—8)
求定点小数补码的方法和求定点整数补码的方法完全相同(但补位是在低位加0)。
例如按8位字长
xx补位后[x]补
+0.10011+0.10011000.1001100
-0.10011-0.10011001.0110100
-0.1101-0.11010001.0011000
②由补码求真值
下面推导由补码求真值的方法
设[x]补=xnxn-1xn-2…x1
若xn=0则真值为正,由定义式知x=+xn-1xn-2…x1
若xn=1则真值为负,由定义式[x]补=2n+x
得x=-2n+[x]补=-2n+1xn-1xn-2…x1
=-2n+2n-1+xn-1xn-2…x1
=-2n-1+xn-1xn-2…x1
=-(2n-1-xn-1xn-2…x1)
=-(11…1+1-xn-1xn-2…x1)
=-((1-xn-1)(1-xn-2)…(1-x1)+1)
=
即由补码求真值的方法可概括为:
若补码的符号位为0,则真值为正,真值的数值部分等于补码的数值部分;若补码的符号位为1,则真值为负,真值的数值部分由补码的数值部分求补得到。
例如若[x1]补=00110100[x2]补=10110100
则x1=+0110100x2=-1001100
3.由x的补码求-x的补码
在数据处理中经常要做加法运算和减法运算。
若各数均用补码表示,运算结果也用补码表示,则根据式(1.2-4)和(1.2-5),可将加减运算表示为
[x+y]补=2n+(x+y)=2n+x+2n+y=[x]补+[y]补(mod2n)
[x-y]补=[x+(-y)]补=[x]补+[-y]补(mod2n)
这样在做补码的减法运算时,需要由减数的补码求其相反数的补码。
下面推导由一个数的补码求其相反数的补码的方法。
设[x]补=xnxn-1xn-2…x1
由[x]补=2n+x(mod2n)
得-x=2n-[x]补=2n-xnxn-1xn-2…x1
则[-x]补=2n+(-x)=2n+2n-xnxn-1xn-2…x1(mod2n)
=2n-xnxn-1xn-2…x1
=111…1+1-xnxn-1xn-2…x1
=(1-xn)(1-xn-1)(1-xn-2)…(1-x1)+1
=
(1.2-9)
即对x的补码(连同符号位)求补就得到-x的补码。
例如若[x]补=00110100[y]补=10110100
则[-x]补=11001100[-y]补=01001100
注意:
由于补码所能表示的数值范围中的特殊数(就是绝对值最大的负数,对n位定点整数来说就是-2n-1;对n位定点小数来说就是–1.0)的相反数超出补码所能表示的数值范围,不能对其求补码。
1.2.4反码(one’scomplement)
反码也是按模定义的,但对n位定点整数来说反码是以2n-1为模。
即
[x]反=2n-1+x(mod2n-1)(1.2-10)
根据模的特点,n位定点整数反码定义式可写成
(1.2-11)
式中[x]反表示真值x的反码。
不难得知,n位定点整数反码所能表示的数值范围为–(2n-1-1)~+(2n-1-1)。
0的反码有两种形式
[+0]反=00…0
[-0]反=2n-1-0=11…1
由反码的定义式和补码的定义式可知,当x>0时,[x]反=x=[x]补;当x<0时,[x]反=2n-1+x=2n+x-1=[x]补-1。
对比真值和补码的转换方法,不难得出由真值求反码的方法为:
先将真值的数值部分补位定长,对于正数,其反码的符号位为0,数值部分等于真值的数值部分;对于负数,其反码的符号位为1,数值部分由真值的数值部分按位取反得到。
例如对下列各数按8位字长写出其反码
x1=10011x2=-10011
x3=0.10011x4=-0.10011
解:
先补位(整数在高位补0,小数在低位补0)
x1=00