2.3 信息在计算机中的表示
2.3.1 数值数据在计算机中的表示
1.无符号整数的表示
数值计算是现代计算机的基本功能之一,日常生活中的许多任务都涉及大量的数值计算。为了完成各种数值计算的任务,首先要解决的是决定各种类型的数值如何在计算机中表示的问题。无符号整数是计算机可以处理的最简单的数值类型。以字长为16的计算机为例,一个无符号整数通常表示为一个16位二进制数,例如无符号整数100被表示成二进制数0000000001100100。
由于在字长为16的计算机中,一个整数被表示成两个字节。因此能表示的无符号整数的范围是有限的:最小的整数是0(二进制数0000000000000000);最大的整数为65535(二进制数1111111111111111)。一般而言,字长为 N的计算机所能表示的无符号整数的范围为0~2N-1。
二进制无符号整数的运算规则同十进制是类似的。以加法为例,在十进制运算中,遵循“逢十进一”的原则;但在二进制运算中,则遵循“逢二进一”的原则。例如:
在上述加法运算中,由于被加数和加数最右边的二进制位均为1,故而相加后执行进位。被加数右边第2位是1,加数右边第2位是0,两者相加不进位,但由于还需要与来自右侧的进位1相加,所以还会产生进位。
两个数的运算结果可能会超出表数的范围。以加法为例,两个位于表数范围内的无符号整数,其运算结果完全可能大于65535,这时一般称运算发生了溢出。如果运算发生溢出,则运算结果是不正确的,程序员需要对溢出的运算结果进行专门的处理。
与此相关的另一个问题是如何处理超出表数范围的无符号整数。此时,只能由程序员编写专门的大数处理程序,将一个超出表数范围的数分解成多段进行处理。
2.有符号整数的表示
整数有正有负,计算机中也必须能够处理有符号的整数。计算机中常用补码表示有符号的整数。在补码表示中,零和正整数的补码表示同无符号整数一样。例如,在字长为16的计算机中,0的补码表示为0000000000000000, +1的补码表示为0000000000000001, +2的补码表示为0000000000000010,以此类推,+32767的补码表示为0111111111111111。
负整数的表示不那么直观,一个负整数的补码表示通常可通过下列步骤得到:
(1)将该负整数转变为相反数。
(2)将该相反数转换为二进制数。
(3)将该二进制数按位求非(也称按位求反);也就是说,把是0的位转换为1,而把是1的位转换成0。
(4)将以上运算得到的数加1。
例如,要在字长为16的计算机中表示有符号整数-100。首先,它的相反数是+100,其对应的二进制数是0000000001100100,按位求非后得到1111111110011011。再将所得的二进制数加1,即
也就是说,-100的补码表示为1111111110011100。按照同样的办法可知,-1的补码表示为1111111111111111, -2的补码表示为1111111111111110, -3的补码表示为1111111111111101,以此类推,-32768的补码表示为1000000000000000。
在字长为16的计算机中,有符号整数的补码表示方案可用表2-3来表示。
表2-3 有符号整数的补码表示方案
从表2-3可以看出,由于16个二进制位最多可以表示65536个不同的二进制数,整个表数空间被分成了两个部分:最高位为0的部分被用来表示零和正整数;最高位为1的部分被用来表示负整数。因此从表数范围看,采用补码表示方案,字长为16的计算机可以表示的有符号整数的范围为-32768~+32767。一般而言,对于字长为N的计算机而言,采用补码表示方案,可以表示的有符号的整数的范围为-2N-1~2N-1-1。
为什么这种表数方案被称为补码表示方案呢?原因是在补码表示方案中,一个负整数实际上是用该数的相反数的补数来表示的。以字长为16的计算机为例,1相对于65536的补数是65536-1(即65535),其二进制表示为1111111111111111,所以 -1的补码表示为11111111111111111;100相对于65536的补数是65536-100(即65436),其二进制表示是1111111110011100,故-100的补码表示为1111111110011100。也就是说,如果把X以及-X的补码表示均视做无符号整数的话,则X的补码与-X的补码之和是2N(N是计算机的字长)。
由于采用补数来表示某数的补码,对于一个补码表示的二进制数,人们直观上有时看不出它所表示的实际数字。若已知某数的补码表示为aN-1aN-2…a1a0(ai=0或1;0≤i≤N-1),则该补码表示所对应的十进制数为
采用补码方案表示有符号整数,尽管不是很直观,但带来运算上的方便。同其他一些表示方案相比,补码表示法在运算时不用考虑符号位的问题,作为符号位的最高位可以和其他位一样参与运算。仍以加法为例,考虑在字长为16的计算机中,计算-14与+9的和,可知-14与+9的补码表示分别为1111111111110010和0000000000001001,则两者相加可以直接按照无符号整数相加的规则进行,即
而运算结果1111111111111011正好是-5的补码表示,即-14 +9 =-5。在补码表示方案中,减法也可以很容易地转换为加法进行。例如,9-14可以转换成9+(-14),因此只需把9和-14的补码相加,即可得到两者的差。