二、二进制及数值信息的表示和运算
(一)二进制
1.什么是二进制
二进制的基数是“2”,它只使用两个不同的数字符号,即0和1,而且二进制数是“逢二进一”。
2.二进制数的运算
对二进制数有两种不同类型的运算处理:算术运算和逻辑运算。
3.不同进位制数之间的转换
十进制整数转换成二进制整数可以采取“除以2取余法”。
十进制小数转换成二进制小数,可以采取“乘以2取整法”,把给定的十进制小数不断乘以2,取乘积的整数部分作为二进制小数的最高位,然后把乘积小数部分再乘以2,取乘积的整数部分,得到二进制小数的第二位,重复上述过程,就可以得到希望的位数,有时得到的是近似值。八进制数转换成二进制数的方法很简单,只要把每一个八进制数字改写成等值的3位二进制数即可,且保持高、低位的次序不变。八进制数字与二进制数的对应关系如下:
(0)8 =000 (1)8 =001 (2)8 =010 (3)8 =011
(4)8 =100 (5)8 =101 (6)8 =110 (7)8 =111
十六进制数转换成二进制数的方法与八进制数转换成二进制数的方法类似,只要把每一个十六进制数字改写成等值的4位二进制数即可,且保持高、低位的次序不变。十六进制数字与二进制数的对应关系如下:
(0)16 =0000 (1)16 =0001 (2)16 =0010 (3)16 =0011
(4)16 =0100 (5)16 =0101 (6)16 =0110 (7)16 =0111
(8)16 =1000 (9)16 =1001 (A)16 =1010 (B)16 =1011
(C)16 =1100 (D)16 =1101 (E)16 =1110 (F)16 =1111
二进制数转换成八进制数,整数部分从低位向高位方向每3位用一个等值的八进制数来替换,最后不足3位时在高位补0凑满3位;小数部分从高位向低位方向每3位用一个等值的十六进制数来替换,最后不足3位时在低位补0凑满3位。
二进制数转换成十六进制数,整数部分从低位向高位方向每4位用一个等值的十六进制数来替换,最后不足4位时在高位补0凑满4位;小数部分从高位向低位方向每4位用一个等值的十六进制数来替换,最后不足4位时在低位补0凑满4位。
二进制数与八进制数、十六进制数有很简单、直观的对应关系。二进制数太长,书写、阅读、记忆均不方便;八进制、十六进制却像十进制数一样简练,易写易记。必须注意,计算机中只使用二进制一种计数制,并不使用其他计数制,但为了开发程序、调试程序、阅读机器内部代码时的方便,人们经常使用八进制或十六进制来等价地表示二进制,所以大家也必须熟练地掌握八进制和十六进制。
4.二进制信息的计量单位
二进制的每一位(即“0”或“1”)是组成二进制信息的最小单位,称为1个“比特”(bit),或称“位元”,简称“位”,一般用小写的字母“b”表示。比特是计算机中处理、存储、传输信息的最小单位。
另一种稍大些的二进制信息的计量单位是“字节”(Byte),也称“位组”,一般用大写字母“B”表示。一个字节等于8个比特。
在信息处理系统中,使用各种不同的存储器来存储二进制信息时,使用的度量单位是比字节或字大得多,经常使用的单位有:
“千字节”(KB),1KB=2 10 字节=1024B
“兆字节”(MB),1MB=2 20 字节=1024KB
“吉字节”(GB),1GB=2 30 字节=1024MB(千兆字节)“太字节”(TB),1TB=2 40 字节=1024GB(兆兆字节)
在网络中传输二进制信息时,由于是一位一位串行传输的,传输速率的度量单位与上述单位有所不同,且使用的是十进制。经常使用的速度单位有:
“比特/秒”(b/s),有时也称“bps”。如2400bps(2400b/s),9600bps(9600b/s)等。
“千比特/秒”(kb/s),1kb/s=10 3 比特/秒=1000b/s
“兆比特/秒”(Mb/s),1Mb/s=10 6 比特/秒=1000kb/s
“吉比特/秒”(Gb/s),1Gb/s=10 9 比特/秒=1000Mb/s
“太比特/秒”(Tb/s),1Tb/s=10 12 比特/秒=1000Gb/s
在计算机内部对二进制信息进行运算和处理时,使用的单位除了位(比特)和字节之外,还经常使用“字”作为单位。以80x86或Pentium微处理器为例,处理器可直接进行操作处理的数据单位有5种:位(dit)、字节(Byte)、字(Word)、双字(DoubleWord)和四字(QuadWord)。
(二)数值信息在计算机内的表示
1.整数(定点数)的表示
整数不使用小数点,所以它也叫做“定点数”。计算机中的整数分为两类:不带符号的整数(Unsigned Integer),带符号的整数(Signed Integer)。
不带符号的整数常用于表示地址等正整数,它们可以是8位、16位甚至32位。8个二进位表示的正整数其取值范是0~255(2 8 -1),16个二进位表示的正整数其取值范是0~65535(2 16 -1),32个二进位表示的正整数其取值范是0~2 32 -1。
带符号的整数必须使用一个二进位作为其符号位,一般总是最高位(最左面的一位),“0”表示“+”(正数),“1”表示“-”(负数),其余各位则用来表示数值的大小。
为了内部运算处理方便,负整数在计算机内不止一种表示方法。上面的表示法称为“原码”,另外的两种方法分别叫做“反码”和“补码”。
负数使用反码表示时,符号位仍为“1”,但绝对值部分却正好与原码相反(“0”变为“1”,“1”变为“0”)。
负数使用补码表示时,符号位也是“1”,但绝对值部分却是反码的个位加“1”后所得到的结果。注意:正整数无论采用原码、反码还是补码表示,其编码都是相同的,并无区别。
还有一种整数也经常在计算机内使用,称为“二进制编码的十进制”整数(Binary Coded Decimal,简称BCD整数),它使用4个二进位表示1个十进制数字,符号的表示仍与上相同。
2.实数(浮点数)的表示
实数也叫浮点数,因为它的小数点位置不固定。
一个实数总可以表达成一个纯小数和一个乘幂之积。
任意一个实数,在计算机内部都可以用“指数”(这是整数)和“尾数”(这是纯小数)来表示,这种用指数和尾数表示实数的方法叫做“浮点表示法”。所以,在计算机中实数也叫做“浮点数”,而整数则叫做“定点数”。
由于指数可以选用不同的编码(原码、补码等),尾数的格式和小数点位置也可以有不同规定,因此,浮点数的表示方法不是惟一的。不同计算机可以有不同的规定,这就引起了相互间数据格式的不兼容性。为此,美国电气与电子工程师协会(IEEE)制订了有关浮点数表示的工业标准IEEE754,已被当代所有各类处理器采用。
浮点数的长度可以是32位、64位甚至更长,位数越多,可表示的数值的范围越大,精度也越高。
(三)整数的性质和运算
1.整数补码表示的数学意义
无符号二进制整数的原码,其编码与数值之间的关系如下。
设K n Kn-1 …K1 K0是一个无符号二进制整数,S是它相应的十进制数值,则
S=Kn ×2 n +Kn-1 ×2n-1 +…+K1 ×21 +K0 ×2 0
其中的Kj(j=n,n-1,…1,0)只能为0或1,Kn 是最高位,K0 是最低位(个位)。
Kn Kn-1 …K1 K0 用来表示带符号整数时,Kn 是符号位,Kn-1 …K1 K0 则为数值位。若Kn Kn-1 …K1 K0 表示的是原码编码的整数,则十进制数值S与编码的关系是:
S=Kn-1 ×2n-1 +…+K1×2 1 +K0 ×2 0 (当Kn =0)
S=-(Kn-1 ×2 n-1 +…+K 1 ×2 1 +K0 ×20 )
(当Kn =1)
但是,如果Kn n-1 …K1 K0 表示的是补码编码的整数时,不论符号位K n 如何,十进制数值S与编码的关系可以统一地表示成为:
S=Kn ×(-2n )+Kn-1 ×2n-1 +…+K1 ×21 +K0 ×20 采用补码表示的n位二进制带符号整数的有效范围是: -2n-1 ≤S≤2n-1 -1
计算机在整数运算过程中,若结果超出此允许范围,则称为发生“溢出”。
2.整数的算术、逻辑运算
(1)不同长度整数之间的转换
一般而言,短整数可以转换成长整数表示,而反过来却不行。短整数转换成长整数表示的方法是:把符号位向左扩充至所需要的长度为止。
(2)整数的变号操作
所谓“变号操作”是指将该整数变成绝对值相同但符号相反的另一个整数。变号操作又叫“取负”运算,它的处理方法是:将该整数的每一个二进位变反,然后在最末位(个位)加1,其结果即为所求值。
(3)整数的移位操作
移位操作有多种,按照移位方向来分,移位操作可分成左移、右移两大类;按照操作性质则又可区分为算术移位、逻辑移位和循环移位等不同类型。它们有些只对整数进行,有些则可以对任何二进制数进行。
(4)逻辑运算
逻辑运算(又叫布尔运算)总是按位进行处理的,即对应位之间进行规定的逻辑运算,不考虑位与位之间的进位。常用的基本逻辑运算有4种:“非”运算(NOT)、“或”运算(OR)、“与”运算(AND)、“按位加”运算(XOR),它们都非常简单。
(5)整数加法
两个带符号整数相加的运算方法很简单,只需从低位到高位把所有位(包括符号位)相加,逢2进1,最高位产生的进位忽略不计。
(6)整数减法
两个带符号整数相减的运算方法也很简单,只需先把减数变号,然后再与被减数相加即可。
(7)整数乘法
两个无符号整数的乘法很简单,它与日常用纸和笔进行乘法几乎没有什么不同。
(8)整数除法
对于补码表示的两个带符号整数,其除法运行比乘法还要复杂一些。下面是算法的简单描述(假设被除数和除数都是n位):
①把除数(补码)放入寄存器M,把被除数从n位扩展成2n位长的补码后放入寄存器A和Q,高位部分放入A(全0或全1),低位部分放入Q。②把寄存器A和Q向左移1位。
③如果A和M同号,执行A=A-M,否则执行A=A+M。
④执行上一步操作的前后,若A的符号保持不变,或者A和Q(高位部分)的结果都是0,则操作成功,令Q0 =1;否则操作不成功,恢复A原来的内容,并令Q0 =0。⑤重复上述步骤②~④共n次,结束。
除法结束后,寄存器A中存放的是余数,寄存器Q中是得到的商。若被除数与除数异号,则商为负数,所以应再对Q取补。不论何种情况,被除数、除数、商和余数总满足下面的公式:被除数=商×除数+余数
(四)实数的性质和运算
1.实数(浮点数)的性质
下表所示是Pentium微处理器中32位浮点数和64位浮点数的一些性质。
32位浮点数 64位浮点数
符号 阶码 尾数 数值
符号 阶码
尾数 数值
+0 0 全0 全0 0 0 全0 全0 0
-1 1 全0 全0 0 1 全0 全0 0
+∞ 0 全1 全0 +∞ 0 全1 全0 +∞
-∞ 1 全1 全0 -∞ 1 全1 全0 -∞
规格化的
非0正实数 0 0
(1.f)
规格化的
非0负实数 1 0
非规格化的
非0正实数 0 0 f≠0 2 -126 (0.f) 0 0 f≠0 2 -1022
(0.f)
非规格化的非0负实数 1 0 f≠0 -2 -126 (0.f) 1 0 f≠0 -2 -1022
(1.f)
2.实数(浮点数)的四则运算
浮点数的加、减运算要比定点数(整数)复杂得多。下面只做简要介绍。
设浮点数 A=As ×2Ea ,B=Bs ×2Eb 则
和数 C=(As ×2Ea-Eb+Bs )×2Eb ,差 D=(As ×2Ea -Eb -Bs )×2Eb(若Ea ≤Eb )
或者:
和数 C=(As ×Bs ×2Eb -Eb )×2Ea ,差 D=(As -Bs ×2Eb -Ea )×2Ea (若Ea >Eb )一般说来,浮点数的加、减运算有如下几个步骤:
(1)检测A和B中有无0,若A=0,则C=B,若B=0,则C=A。运算结束。
(2)计算两数阶码之差,即d=Ea -Eb ,若d>0,则将尾数Bs 向右移d位,若d<0,则将尾数A s 向右移-d位,若d=0,则As 和Bs 均不移位。这个过程叫做“对阶”。
(3)两尾数相加或相减。
(4)把结果进行规格化。对于Pentium微处理器来说,若结果尾数绝对值小于1,则尾数不断左移且阶码不断减1,直至尾数绝对值大于或等于1;若结果尾数绝对值大于或等于2,则尾数右移1位且阶码加1。
注意:两浮点数加/减时,在结果规格化的过程中,可能会发生“上溢”或“下溢”。浮点数的乘/除法比加/减法稍简单一些,其公式为:
乘积=(As ×Bs )×2Ea +Eb 商=(As /Bs )×2Ea +Eb 处理过程如下:
(1)检测A和B中有无0,若AS =0,则乘积(商)=0,运算结束;若BS =0,乘法时乘积=0,除法时商为∞,运算结束
(2)计算两数阶码之和(或差)。(3)两尾数相乘或相除。
(4)把结果进行规格化。即,若结果尾数绝对值小于1,则尾数不断左移且阶码不断减1;若结果尾数绝对值大于或等于2,则尾数右移且阶码加1。
注意:两浮点数乘/除时,在阶码相加(减)的过程中,或者在结果规格化的过程中,可能会发生“上溢”或“下溢”。
浮点数运算过程中,为了保证浮点数运算的精度,当尾数右移时,对移出的位还需进行“舍入”处理。
【编辑推荐】