1.2.1 二进制 1.什么是二进制
日常生活中人们最熟悉十进制数,一个数用10个不同的符号来表示,每一个符号处于十进制数中不同位置时,它代表的实际数值是不一样的。例如,1 997.82代表的实际值是
1 997.82=1×103+9×102+9×101+7×100+8×10-1+2×10-2 在十进制记数制中,基数是10,它表示这种记数制一共使用10个不同数字符号,低位记满10之后就要向高位进一,即日常所说的“逢十进一”。
二进制和十进制相仿,也是一种进位记数制。但它的基数是2,它只使用两个不同的数字符号,即0和1,而且二进制数是“逢二进一”。例如,二进制数(10101)2代表的实际数值是
(10101)2=1×24+0×23+1×22+0×21+1×20=(21)10
对于二进制小数,也有类似情况,例如(101.01)2的实际数值是 (101.01)2=1×22+0×21+1×20+0×2-1+1×2-2=(5.25)10 从十进制和二进制的概念出发,可以进一步推广到更一般的任位制的情况。最常用的有八进制和十六进制两种。八进制数使用0、1、2、3、3、4、5、6、7这8个数字,逢八进一。
(365.2)8=3×82+6×81+5×80+2×8-1=(245.25)10
十六进制数使用0、1、2、4、5、6、7、8、9、A、B、C、D、E、F这16个符号,其中A、B、C、D、E、F分别代表十进制的10、11、12、13、14、15。在十六进制数中,低位逢十六进一,高位借一当十六。 (F5.4)16=15×161+5×160+4×16-1=(245.25)10
3.不同进位制数之间的转换
例1.1 二进制数转换成十进制数。
(111.001)2=(1×22+1×21+1×20+0×2-1+0×2-2+1×2-3)10=(7.125)10 例1.2 八进制数转换成十进制数。
(34.6)8=(3×81+4×80+6×8-1)10=(28.75)10 例1.3 十六进制数的转换成十进制数
(2AB.C)16=(2×162+10×161+11×160+12×16-1)10=(68.375)10 4. 二进制信息的计量单位
二进制的每一位(即0或1)称为“二进制位”,英文是binary digit,缩写为bit,中文直译为比特,也称为“二进位”,在含义不发生混淆时简称“位”,一般用小写的字母“b”表示。比特是计算机处理、存储、传输信息的最小单位。在计算机系统中,存储容量是用它能存储多少字节的二进制信息作为度量单位的。内存容量的度量单位有:
千字节(KB),1 KB=210B=1 024 B 兆字节(MB),1 MB=220B=1 024 KB 吉字节(GB),1 GB=230B=1 024 MB
太字节(TB),1 TB=240B=1 024 GB 1.2.2 整数在计算机内的表示 1.整数(定点数)的表示 整数不使用小数点,或者说小数点是隐含在个位数右面的,所以它也称为定点数。计算机中的整数分为两类:不带符号的整数(unsigned integer),此数整数一定是正整数;带符号的整数(signed integer),此类整数既可表示整数,又可表示负整数。
不带符号的整数常常用于表示地址等正整数,它们可以是8位、16位甚至32位。8个二进位所能表示的正整数其取值范是0~255(28-1),16个二进位所能表示的正整数其取值范围是0~65 535(216-1),32个二进位所能表示的正整数其取值范围是0~232-1。
带符号的整数必须使用一个二进位作为其符号位,一般总是最高位(最左面的一位),0表示“+”(正数),1表示“-”(负数),其余名位则用来表示数值的大小。例如:
00101011=+43 10101011=-43
可见,8个二进位所能表示的带符号整数其取值范围是
77
-127~+127(-2+1~+2-1),16个二进位所能表示的带符号整数其取值范围是-32 767~+32 767(-215+1~+215-1),32个二进位所能表示的带符号整数其取值范围是-231+1~+231-1,64个二进位所能表示的带符号整数其取值范围也可类似地推算出来。
为了内部运算处理方便,数值为负的整数在计算机内不止一种表示方法。上面的表示法称为“原码”,另外的两种表示方法分别称为反码和补码。
负数使用反码表示时,符号位为1,但绝对值部分却正好与原码相反(0变为1,1变为0)。例如: (-43)原=10101011 (-43)反=11010100
负数使用补码表示时,符号位也是1,但绝对值部分却是反码的个位加1后所得到的结果。例如: (-43)原=10101001 (-43)反=11010100 (-43)补=11010101
还有一种整数也经常在计算机内使用,称为“二进制编码的十进制”整数(binary coded decimal,BCD整数),它使用4个二进位表示1个十进制数字,符号的表示仍与上相同。例如: (-56)BCD=1 0101 0110 2.整数的运算
(1)不同长度整整之间的转换
一般而言,短整数可以转换成长整数表示而保持其数值不变,而反过来却不行。短整数转换成长整数表示的方法是,把符号位向左扩充至所需要的长度为止。 (2)整数的变号操作
所谓“变号操作”,是指将该整数变成绝对值相同符号相反的另一个整数。变号操作又称为“取负”运算,它的处理方法是,将该整数的每一个二进位变反,然后在最末位(个位)加1,其结果即为所求。 (3)整数的移位操作
移位操作有多种。按照移位方向来分,移位操作可分成左移、右移两大类;按照操作性质则又可区分为算术移位、逻辑移位和循环移位等不同类型。 ① 算术移位
当乘数或除数是2n时,算术移位用来快速地完成对整数进行乘法或除法的运算。算术左移n位相当于乘以2n,执行方法是把原来的数中每一位都向左移n个位置,左面移出的高位丢弃,右面低位空出的位置上全部补0。若正数左移过程中移出的位中包含1,或者负数移出的位中包含0时,则表示运算结果超出了可表示的数值范围,即发生了溢出,结果不正确。 ② 逻辑移位
逻辑左移n位的执行方法是,把原来的数中每一位都向左移动n个位置,左面移出的高位丢弃,右面低位空出的位补0。
逻辑右移n位的执行方法是把原来的每一位都向右移动n个位置,右面移出的低位丢弃,左面高位的位置上全部补0。 ③ 循环移位
循环移位是一种逻辑操作,它仅仅移动操作数中二进位信息的位置,不会丢弃任何一位信息。循环左移n位是把原来的数中每一位都向左移动n个位置,左面移出的高位放在右面低位空出的位置上。循环右移n位则把原来数中的每一位都向右移动n个位置,右面移出的低位放到左面高位空出的位置上。 (4)逻辑运算
逻辑运算(又称为布尔运算)总是按位进行处理的,即对应位之间进行规定的逻辑运算,不考虑位与位之间的进位。常用的基本逻辑运算有4种:“非”运算(NOT)、“或”运算(OR)、“与”运算(AND)、“按位加”运算(XOR),它们都非常简单。
(5)整数加法
两个带符号整数相加的运算方法很简单,只需从低位到高位把所有位(包括符号位)相加,逢二进一,最高位产生的进位忽略不计。做加法运算时判断有无溢出的规则是,两个同号的整数相加,若结果的符号却相反,则发生溢出。注意,是否发生溢出并不取决于最高位有无进位。 (6)整数减法
两上带符号整数相减的运算方法也很简单,只需先把减数变号,然后再与被减数相加即可。
做减法运算时判断有无溢出的规则是,两个异号的整数相减,若结果的符号与被减数符号相反,则发生益出。当然,是否发生溢出也并不取决于最高位有无进位。 1.2.3 实数在计算机内的表示 1.实数(浮点数)的表示 实数也称为浮点数,因为它的小数点位置不固定。实数是既有整数又有小数的数,整数和纯小数可以看做是实数的特例。任意一个实数在计算机内部都可以用“指数”(整数)和“尾数”(纯小数)来表示,这种用指数和尾数来表示实数的方法称为“浮点表示法”。所以,在计算机中实数也称为浮点数,而整数则称为定点数。
以流行的Pentium系列微处理器中的浮点数为例,它表示为如下形式。 (-1)s2E(b0△b1b2b3?bp-1)
可以看出,pentium系列微处理器中的浮点数具有如下性质。 ① 最高位是符号位,它表示该浮点数(实数)的正负。
② 规格化浮点数的尾数的最高位(第1位)总是1,它不必在尾数表示出来。 ③ 浮点数的0有两种,+0和-0。+0表示成全0,即0 00000000 000000000000000000000000,-0表示成1 00000000 00000000000000000000000。 ④ 浮点数的表示范围虽然很大,但运算中还是可能出现超出它允许范围的一些结果,这种情况称为“向上溢出”。
⑤ 浮点数能表示绝对值很小的数,当运算中出现绝对值更小的数时,这种情况称为“向下溢出”,这时,处理器只能用0来表示。 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-Ea) ×2Ea,差D=(As-Bs×2Eb-Ea) ×2Ea(若Ea>Eb) 一般来说,浮点数的加、减运算有如下几个步骤:
① 检测A和B中有无0,若A=0,则C=B,若B=0,则C=A。运算结束。
② 计算两数阶码之差,即d=Ea-Eb,若d>0,则将尾数Bs向右移d位,若d<0,则将尾数As向右移-d位,若d=0,则As和Bs均不移位。这个过程称为对阶。 ③ 将对阶过后的两个尾数相加或相减。
④ 把结果进行规格化。对于Pentium处理器来说,若结果尾数绝对值小于1,则尾数不断左移且阶码不断减1,直至尾数绝对值大于或等于1;若结果尾数绝对值大于或等于2,则尾数右移1位阶码加1。 注意,两浮点数相加或相减时,在结果规格化的过程中,可能会发生上溢或下溢。浮点数的乘除法比加减法稍简单一些,其公式为: 乘积=(As×Bs)×2Ea+Eb 商=(As/Bs) ×2Ea-Eb 处理过程如下。
① 检测A和B中有无0,若As=0,则乘积(商)=0,运算结束;若Bs=0,做乘法运算时乘积=0,做除法运算时商为∞,运算结束。 ② 计算两数阶码的和(或差) ③ 两尾数相乘或相除。
④ 把结果进行规格化,即:若结果尾数绝对值小于1,则尾数不断左移且阶码不断减1,若结果尾数绝对值大于或等于2,则尾数右移且阶码加1。
注意,两浮点数相乘或相除时,在阶码相加 (减)的过程中,或者在结果规格化的过程中,可能会发生上溢或下溢。浮点数运算过程中,为了保证浮点数运算的精度,当尾数右移时,对移出的位还需进行舍入处理,这里就不赘述了。 1.3 文字符号在计算机中的表示与处理 1.3.1 西文字符的编码 西文是由拉丁字母、数字、标点符号及一些特殊符号所组成的,它们统称为字符。所有字符的集合称为字符集。字符集有多种,每一字符集的编码方法也多种多样。目前计算机中使用最广泛的西文字符集及其编码是ASCII码,即美国标准信息交换码。每个字符都由7个二进位b6b5b4b3b2b1b0表示。
ASCII码是7位的编码,但由于字节是计算机中的基本处理单位,故一般仍以一字节来存放一个ASCII字符。 1.3.2 汉字的编码 1. GB 2312汉字编码