原码反码补码为什么这么多码?
上次我写了一篇文章,解释了为什么用补码的原因。可以看这里
为了简化电路设计,我们需要把减法转换为加法,怎么办呢?就是引入补码,补码的计算过程中用到反码,于是我们引入了反码和原码的概念。
这个就是原码反码补码产生的原因和背景。
求补码这是一个重点。
分成两个部分,正数的补码和负数的补码。
正数的补码就等于它的原码,原码怎么求呢?很简单,其实就是一个十进制转二进制的过程,可以看这篇文章。
要求负数的补码,必须先求负数的反码,要求负数的反码,必须先求负数的原码,要求负数的原码,必须先求对应的正数的原码。
下面举一个例子,正数很简单,就拿负数来算吧。
求-45的补码
求补码先看是正数还是负数。这里是一个负数,那么就用负数的求法。
要求-45的补码,必须求-45的反码,要求-45的反码,必须先求-45的原码,要求-45的原码,必须求45的原码。
45的原码怎么求呢?
列出二进制权重表
64 32 16 8 4 2 1
很容易就得到对应的二进制,假设是8个二进制位
0010 1101
把45原码的符号位改成1,即1010 1101,这就是-45的原码
接下来求-45的反码
负数的反码是在原码的基础上求得的,符号位不变,其它位都取反。
1010 1101 经过计算就是1101 0010,这就是-45的反码
-45的补码是在反码的基础上求得的,把反码加1即可。
最后就是1101 0010 +1=1101 0011
所以-45的补码就是1101 0011
有时候还会遇到给出一个数的补码,让你求这个数,这种问题,就是求补码的逆过程。
OK,假设我们现在知道了某个数的补码是1101 0011,怎么得出它对应的数是-45呢?
1101 0011,首先要定性一下,它是正数还是负数,这里最高位是1,所以它代表的是一个负数。那负数的补码是在反码的基础上加1得到的。
假设那个反码就是abcd efgh,即abcd efgh+1=1101 0011
可以得到abcd efgh=1101 0010
意思是某个负数的反码是1101 0010,那么这个负数的原码就是1010 1101
1010 1101 这是一个负数,它对应的正数的原码是0010 1101,它是多少呢?
32*1+8*1+4*1+1*1=45,给它加一个符号,所以原来的数就是-45