关于计算机中补码的问题

计算机中的有符号数有三种表示方法,即原码、反码和补码

三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”;

而数值位,三种表示方法各不相同。

在计算机系统中,数值一律用补码来表示和存储

原因在于,使用补码,可以将符号位和数值域统一处理,同时,加法和减法也可以统一处理。

 

接下来,来看一看原码、反码和补码到底是什么,以及它们之间的转换关系。


 

原码:

是一种计算机中对数字的二进制定点表示方法

原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0 和 -0),其余位表示数值的大小。

现在用4个bit(也就是1个byte)表示数字1:

0 0 0 1 (也就是十进制的1)

因为它是正数,所以它的第一位(也就是它的符号位)是 0,剩下的部分(也就是0 0 1)作为数值进行计算,结果是1。

那么 -1 怎么表示呢?

刚刚说到,第一位为符号位,而负数的符号位是1,那么这里的 -1 就可以写成:

0 0 1 


 

反码:

0以及正数的反码就是其本身,也就是说0的反码还是0,一个正数的反码还是这个正数自身。

而负数则不同,负数的反码,除了第一位符号位不变(还是 1 ),其余各位取反,这样就得到了它的反码。

那么 -1 的反码是多少呢?

1 0 0 1【原码】

1 1 1 0 【反码】

解析:001各位取反就是110。


补码:

  • 对负数的原码取反,再加1,这样就得到了它的补码。
  • 也就是说对负数的反码加1,就得到了它的补码。
  • 正数的补码还是其本身。0的补码还是0。

还是以 -1 举例子,它的补码是多少呢?

1 0 0 1【原码】

1 1 1 0【反码】

反码加1之后,1110 + 1 = 1111 也就得到-1的补码:

1 1 1 1【补码】  


 

问:在字长为8位的计算机中,-10的原码、反码、补码分别是多少?

解答:

(1)10的原码为0000 1010,第一位变为1,得到负数-10。

         1000 1010【原】

         解析:第一位是符号位(-),剩余部分求值:0*2+ 1*2+ 0*2+ 1*2= 0 + 2 + 0 + 8 =  10

 

(2)取反得到反码:

    1111 0101【反】

    解析:0变1,1变0。

 

(3)加1得到补码:

    1111 0110【补】

    解析:1111 0101 + 1 = 1111 0110


 

总结:

补码是计算机系统存储数据的方式,也就是说它的计算实际上都是以补码的方式进行的。

我们所输入的指令是我们看得懂的原码,但是输入计算机时,它会自动解析为补码进行运算。

那么补码的优势在哪里呢?

第一,解决了符号的表示的问题;

第二,可以将减法运算转化为补码的加法运算来实现,克服了原码加减法运算繁杂的弊端,可有效简化运算器的设计;

第三,在计算机中,利用电子器件的特点实现补码和真值、原码之间的相互转换,非常容易;

第四,补码表示统一了符号位和数值位,使得符号位可以和数值位一起直接参与运算,这也为后面设计乘法器、除法器等运算器件提供了极大的方便。

总之,补码概念的引入和当时运算器设计的背景不无关系,从设计者角度,既要考虑表示的数的类型(小数、整数、实数和复数)、数值范围和精确度,又要考虑数据存储和处理所需要的硬件代价。

因此,使用补码来表示机器数并得到广泛的应用,也就不难理解了。

(本文参考资料:https://baike.baidu.com/item/%E8%A1%A5%E7%A0%81/6854613?fr=aladdin

posted @ 2019-12-31 20:27  见嘉于世  阅读(1824)  评论(0编辑  收藏  举报