计算机中的有符号数有三种表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用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 就可以写成:
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*20 + 1*21 + 0*22 + 1*23 = 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)