软考考点之数据的表示

补码:

补码的实质是    变减为加

  在计算机中使用加法器对数据进行计算,那么如何进行减法的运算呢?

  设Mod=16

  若a=3,b=-4,则a+b=a+b+Mod=-1+Mod=a+(Mod-4)=15(在计数系统中-1和15等价)

  实际上Mod-4就是b的补数,所有的减法在计算机中都可以转化为加上减数的补数,对应计算机上的概念就是补码

  因此,计算机是使用补码(补数)进行计算

减数与其补码两个数相加之和会将计算机所有位数清零。

对于N位(bit)计算机而言,一个减数与其补码之和可以使N位清零。

减数就是我们现实生活中人类可读的数字,补码是计算机识别的编码符号。

由减数转化为补码这个过程称为编码,如实际数字-9转换为补码91就是编码;  

由补码转换为减数这个过程称为解码,如补码91转换为实际数字-9就是解码。
 

到这里你可能想明白了为什么8bit二进制计算机内补码1111_1111表示-1,为什么补码1000_0000是最大负数-128而不是-0了吧。

这样一来,00到99这100个补码就表示了实际数字-50到49。

二进制计算机也是如此,比如8bit计算机共有0000_0000到1111_1111一共256个补码。

256个补码一分为二,0000_0000到0111_1111共计128个补码表示正数,而且和实际数字一一对应。

比如补码0000_0000表示实际数字0,0000_1000表示实际数字8,0111_1111表示实际数字127.

1000_0000到1111_1111共计128个补码表示负数,和实际负数之间采用补码这种映射关系。

比如补码1111_1111表示-1,因为1111_1111加上0000_0001清零;补码1000_0000表示-128,因为1000_0000加上1000_0000清零。

如此一来,8bit二进制计算机就可以表示-128到127这些实际大小的数字了。

在计算机中,8位带符号二进制数的取值范围是[-128, 127],比如Java中byte类型。

这与我们上面的解释对应上了。

同时也澄清了一个误会,计算机最高位1表示负数,是因为1000_0000将256个补码恰好一分为二,用1000_0000及以后的补码表示负数。

计算机对于最高位是1的数字并不是将首位1直接变为负号,而是通过补码这种编码将其整体解码为负数。

所以不要将最高位的1与其它位的二进制数分离开来,分别看待。

 

扩展:

我们要先区分一下原码、反码和补码的表示规则:

0的表示:

               原码:有正零和负零之分,[+0]补=0000 0000,[-0]补=1000 0000;

               反码:同样有两种表示方法,[+0]反=0000 0000 ,[-0]反=1111 1111;

               补码:零只有一种表示方法,不分正负,[0]补=0000 0000;

为二进制表示的范围为:

       一个字节8位,如果采用原码表示正整数(含0),可以表达0-255,即 2^8=256,一共256种状态,从全0到全1的各种排列组合。如果要表示负数,则符号位需要占用一位(最高位,1代表负数,0代表正数),因此其绝对值最大范围为0-127,即2^7=128,一共正负各128种状态,如果不采用特殊处理,这时候0占用2个编码(10000000和00000000),数据表示范围为-127到-0及+0到127,这样总体上一个字节只有255种状态,因为其中0具有正0和负0之分,这不符合数学意义也浪费一个编码。

补码的算法为:绝对值的原码各位取反后加1.        

例1:负1的补码:             绝对值的8位原码为00000001         取反:11111110         加1 :11111111         此时最高位被处理为1,满足高位为1代表负数的定义。        

例2:负128的补码:         绝对值的8位原码为10000000         取反:01111111         加1 :10000000          此时同样的最高位被置为1,同样满足高位为1代表负数的定义,同时原先表示负0的编码被利用起来表示-128。 因此一个字节的有符号整数范围为-128到127。

综上为:

              原码+反码:8位原码和反码能够表示数的范围是-127~127;

              补码:8位补码能够表示数的范围是 -128~127。

            (在补码中用(-128)代替了(-0),所以补码的表示范围为:(-128~0~127)共256个)

软考考点之数据的表示

通用点的形式为:

软考考点之数据的表示