您的位置:首页 > 其它

个人在原码,补码和反码三者之间的浅薄见解

2018-03-17 23:00 281 查看
        本文章参考了不少别的大神的看法,略懂后写了些观感,本篇文章若有侵权或者理解错误,还望指教。
       数据是以一串二进制的数字储存在计算机中,而数据转化为二进制的数值就是称为原码。比如说整数10的原码为0000 1010(八位二进制),其中最左边的一位作为符号位,值为0即为正数,值为1为负数。
        但是如果直接以原码的形式存在计算机中,那么为引来一个bug: -0+0的原码形式不统一,-0的原码为1000 0000,而+0的原码为+0000 0000。但是在数学上-0+0的意义应该是一样的,均为0。

        这还不是计算机不以原码储存的一个原因,另外一个原因就在于计算机它只能做加法运算,所以计算机的减法运算还要转化成加法运算来实现。那通过什么办法实现呢。
        平时日常生活所用到的时钟,我们可以把时钟的时间值看做是十二进制的一种计数器(比如1点钟和13点钟的时针指的是同一个值),所以说 5 - 3  = 2 。 这个式子可以看作是五点钟逆时针转了3个钟到了2点钟。 我们可以把式子变一下, 5 - 2 = 5 + ( 12 - 2 ) = 15 = 3 (这里15 = 3 是因为 15点的时钟指的是3点钟,也可以看成15超过了12,所以舍去了12变成了3)。
        所以在这里我们引出一个概念,这里的容量12被称为,我个人认为模应该是指在一种数学环境中数可选的容量,就像二进制中的模为2。而上面的推断也启示了我们可以将减数变成模减去减数的绝对值,然后和被减数相加得到原本减法的结果。所以我们可以在原码中,把正数的原码不变,负数的原码通过模减去这个原码得到的一串新的二进制数字串,称作补码(根据规定,我们将正数的补码等于原码)。比如说-3的原码为1000 0011,而八位二进制数的模为1 0000 0000,所以其补码为1 0000 0000 - 1000 0011 = 1111 1101,即1111 1101是-3的补码。
        我们可以吧这个运算过程转化一下 1 0000 0000 - 1000 0011 = 1111 1111 - 1000 0011 + 0000 0001,把式子转化成这样子后,由于1111 1111 - 1000 0011的运算就跟把1000 0011的所有位数的值取反一样,而取反得到的原码则被称为反码(在规定中,正数的反码等于原码,而负数取反过程中其符号位不变,所以可能会与之前讲的求补码的过程有冲突,而作者在之前的例子会出现改变符号位的可能,所以按照规定还是保持符号位不变,其他位取反),所以上式子中,1000 0011的反码就是为0111 1100。接下来在原先求负数补码的过程中,我们将式子化成1111 1111 - 1000 0011(在取反) + 0000 0001,那么在这种求负数补码的过程也可以是将负数原码取反后再加一,这也是一般求负数补码的方法。
        而有了补码这种概念后,我们会发现+0的补码是0000 0000,而-0的原码为1000 0000,通过取反加一后我们会发现-0的补码竟然也是0000 0000,正好解决了会出现两个零的可能,而且其中-128的补码是1000 0000(可以带入式子算,其中-128的原码也为1000 0000,所以可以算出其补码正好为1000 0000)。所以补码能够使每个数一一对应,这也是计算机储存数据使用补码而不是用原码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  补码 原码 反码