便于计算机处理的补数

便于计算机处理的补数,刚才之所以没有介绍有关右移的内容,是因为用来填充右移后空出来的高位的数值,有0和1两种形式。要想区分什么时候补0什么时候补1,只要掌握了用二进制数表示负数的方法即可。这部分内容较多,接下来我们就一起来看看表示负数的方法和右移的方法。

二进制数中表示负数值时,一般会把最高位作为符号来使用,因此我们把这个最高位称为符号位。符号位是0时表示正数,符号位是1时表示负数。那么-1用8位二进制数来表示的话是什么样的呢?可能很多人会认为“1的二进制数是00000001,因此-1就是10000001”,但这个答案是错的,正确答案是11111111。
计算机在做减法运算时,实际上内部是在做加法运算。用加法运算来实现减法运算,是不是很新奇呢?为此,在表示负数时就需要使用“二进制的补数”。补数就是用正数来表示负数,很不可思议吧。

为了获得补数,我们需要将二进制数的各数位的数值全部取反,然后再将结果加1。例如,用8位二进制数表示- 1时,只需求得1,也就是00000001的补数即可。具体来说,就是将各数位的0取反成1, 1取反成0,然后再将取反的结果加1,最后就转化成了11111111 (图2-5)。

便于计算机处理的补数
图2-5 获取00000001的补数的方法

补数的思考方式,虽然直观上不易理解,但逻辑上却非常严谨。例如1- 1,也就是1+(- 1)这一运算,我们都知道答案应该是0。首先,让我们将-1表示成10000001(错误的表示方法)来运算,看看结果如何。00000001+10000001=10000010,很明显结果不是0(图2-6)。如果结果是0,那么所有的数位都应该是0才对。

便于计算机处理的补数
图2-6 负数表示有误时的情况

接下来,让我们把- 1表示成11111111(正确的表示方法)来进行运算。00000001+11111111确实为0(=00000000)。这个运算中出现了最高位溢出的情况,不过,正如之前所介绍的那样,对于溢出的位,计算机会直接忽略掉。在8位的范围内进行计算时,100000000这个9位二进制数就会被认为是00000000这一8位二进制数(图2-7)。

便于计算机处理的补数
图2-7 负数表示正确时的情况

补数求解的变换方法就是“取反+ 1”。为什么使用补数后就能正确地表示负数了呢?为了加深印象,我们来看一下图2-7 ,与此同时也希望大家能够牢记“将二进制数的值取反后加1的结果,和原来的值相加,结果为0”这一法则。首先,大家可以用1和-1的二进制形式,来彻底地了解补数的相关内容。除了1+ (- 1)之外,2+ (- 2)、39+ (- 39)等同样如此。总之,要想使结果为0,就必须通过补数来实现。

当然,结果不为0的运算同样可以通过使用补数来得到正确的结果。不过,有一点需要注意,当运算结果为负数时,计算结果的值也是以补数的形式来表示的。比如3- 5这个运算,用8位二进制数表示3时为00000011,而5=00000101的补数为“取反+ 1”,也就是11111011。因此3- 5其实就是00000011+ 11111011的运算。
00000011 + 11111011的运算结果为11111110,最高位变成了1。这就表示结果是一个负数,这点大家应该都能理解。那么11111110表示的负数是多少大家知道吗?这时我们可以利用负负得正这个性质。假若11111110是负△△,那么11111110的补数就是正△△。通过求解补数的补数,就可知该值的绝对值。11111110的补数,取反加1后为00000010。这个是2的十进制数。因此,11111110表示的就是- 2。我们也就得到了3- 5的正确结果(图2-8)。

便于计算机处理的补数
图2-8 3-5的运算结果

编程语言包含的整数数据类型中,有的可以处理负数,有的则不能处理。例如,C语言的数据类型中,既有不能处理负数的unsigned short类型,也有能处理负数的short类型。这两种类型,都是2字节(=16位)的变量,都能表示2的16次幂=65536种值,这一点是相同的。不过,值的范围有所不同,short类型是- 32768~32767, unsigned short类型是0~65535。此外,short类型和unsigned short类型的另一个不同点在于,short类型是将最高位为1的数值看作补数,而unsigned short类型则是32768以上的值。

仔细思考一下补数的机制,大家就会明白像- 32768~32767这样负数比正数多一个的原因了。最高位是0的正数,有0~32767共32768个,这其中也包含0。最高位是1的负数,有- 1~- 32768共32768个,这其中不包含0。也就是说,0包含在正数范围内,所以负数就要比正数多1个。虽然0不是正数,但考虑到符号位,就将其划分到了正数中。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!