原码、反码、补码学习
思考:
计算机中数的表示是怎样的?
计算机是如何做运算?
计算机是二进制世界
众所周知,计算机世界里只有0和1,那么计算机中的数只能用二进制来表示,
举几个二进制数字例子:
括号中为二进制,其余为十进制
(0000 0001) = 1
(1111 1111) = 257
如何表示一个负数呢?很自然就能想到,使用一位用来表示符号,一般二进制数的第一位来表示符号,
0表示正数,1表示负数,例子:
(0000 0001) => 1
(1000 0001) => -1
这种表示方式就是所谓的原码,它很简单,容易被人脑所理解。不过使用它进行运算时,对计算机并不太友好,
计算机数的运算
计算机是使用逻辑电路进行运算,下图就是简单的加法器:
图 一位简单全加器
这个加法器有三个输入两个输出,一个加法器可以完成两位的加法运算,串联多个加法器可以做多位加法。
实现了加法器,但是如何做减法运算呢?难道还要实现一个减法器?答案是不需要,我们知道a + b = a + (-b)
,
我们可以把减法转换成加法来计算,不过这个时候,使用原码就有问题了,不信我们试试看:
(84-81) = 84+(-81) = 3
(0101 0100) 84的原码
(1101 0001) -81的原码
————————————
1(0010 0101)
结果显然是错的,原码没办法使用加法器做加法运算,反码便出现了。
反码
原码和反码可以互相转换,转换规则就是:
正数的反码和原码相同
负数的反码是原码除符号位外,其余位取反的结果
举个例子:
(15-125) = 15+(-125)
(0000 1111) 15的原码 => (0000 1111) 15的反码
(1111 1101) -125的原码 => (1000 0010) -125的反码
————————————————————
(1001 0001)
得出来的结果也是反码,转换成原码后是(1110 1110)
,即为-110
,结果正确!
不过,使用反码需要注意两点:
1.相加得到的结果也是反码,需要转换成原码
2.溢出一位后需要在最低位+1
使用补码,就没有问题了。
补码
正数的补码就是其本身,负数的补码就是其反码的最低位加1。
2-1 = 2+(-1) = 1
(0000 0010) 2的原码 => (0000 0010) 2的反码 => (0000 0010) 补码
(1000 0001) -1的原码 => (1111 1110) -1的反码 => (1111 1111) 补码
————————————————————————————————
(0000 0001)
隐藏其中的数学原理
todo