04-有符号整数
15.1.2 有符号整数
如何表示有符号整数取决于硬件,而不是C语言。也许表示有符号数最简单的方式是用1位(如,高阶位)存储符号,只剩下7位表示数字本身(假设存储在1字节中)。用这种符号量(sign-magnitude)表示法,10000001表示−1,00000001表示1。因此,其表示范围是−127~+127。
这种方法的缺点是有两个0:+0和-0。这很容易混淆,而且用两个位组合来表示一个值也有些浪费。
二进制补码(two’s-complement)方法避免了这个问题,是当今最常用的系统。我们将以1字节为例,讨论这种方法。二进制补码用1字节中的后7位表示0~127,高阶位设置为0。目前,这种方法和符号量的方法相同。另外,如果高阶位是1,表示的值为负。这两种方法的区别在于如何确定负值。从一个9位组合100000000(256的二进制形式)减去一个负数的位组合,结果是该负值的量。例如,假设一个负值的位组合是10000000,作为一个无符号字节,该组合为表示128;作为一个有符号值,该组合表示负值(编码是7的位为1),而且值为100000000-10000000,即10000000(128)。因此,该数是-128(在符号量表示法中,该位组合表示−0)。类似地,10000001是−127,11111111是−1。该方法可以表示−128~+127范围内的数。
要得到一个二进制补码数的相反数,最简单的方法是反转每一位(即0变为1,1变为0),然后加1。因为1是00000001,那么−1则是11111110+1,或11111111。这与上面的介绍一致。
二进制反码(one’s-complement)方法通过反转位组合中的每一位形成一个负数。例如,00000001是1,那么11111110是−1。这种方法也有一个−0:11111111。该方法能表示-127~+127之间的数。