原码,反码,补码的浅浅解析
采用补码的形式储存,在谈到补码的时候,我觉得有必要谈谈原码,反码,和补码这三个概念
所谓的原码是计算机储存数据的一种形式,由符号位,数值位组成,在计数的时候采用二进制,整数的符号位和数值位用“,”隔开,小数的符号位和数值位用“."隔开,我们以四位的机器为例子
如表示+3 “0,011”
那么问题来了,-3 怎么表示呢 用”1,011“表示吗
这就引出了后面反码和补码的概念
反码通常是用来由原码求补码或者由补码求原码的过渡码
反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反
按位取反大概意思就是:用计数系统所能表示的最大数减去一个数就能得到它的反(二进制计数系统的最大值为1)
大家先记住这三条,比如100取反就是在每一位用1减去该位所在的数字 就是011
比如+3的反码就是
接下来就是讨论补码的时间了,先看一个例子,如果我们单纯用符号位去表示正负,那么会出现怎样的加减情况?
表示-3 用 1011 那么理论上3+(-3)=0 化为二进制就是 0011+1011=1110,1110无论如何解释,都无法将它和0扯上关系 如果我们用补码的话 先求正原码的反码,再在反码的基础上加一(这是求补码的操作)
比如求-3的补码 先写出3的原码011 求反码 100 再加1 101 然后添加符号位 即 用”1,101“来表示-3
这一下再算 很显然 1作为符号位,取后四位,结果就是0 注意这里说的1并不是真的就是补码的符号位,接下来就仔细听我狡辩
我在这里举一个网络上都举烂的例子
一个十二进制的时钟(大家可以看一看自己的手表) 顺时针走俩小时和逆时针走十小时的效果其实是一样的
也就是说-2 和+10 的效果是一样的 我们称-2 和+10互为补码 在一定的情况下 +10可以代替-2进行运算,在这就不举例子了,也就是说,在计算机当中,我们用加法的运算表示了减法的运算,在这里不得不赞叹一下前人的指挥。
话说到这里,大家是不是明白了,我求负数的补码,求出来实际上是一个正数,既然是正数,还区分啥符号位,不就是在最前面再加一个0吗,其运算效果也是一样的嘛(小声的狡辩)
咱就是说 补码的最高位能起到符号位的作用,但并不是真正的符号位,实际上是一个数值位,算的时候还是可以当作数值位计算的