美文网首页
计算机中的原码、反码、补码

计算机中的原码、反码、补码

作者: gaaaaaaaaaao | 来源:发表于2016-10-15 01:02 被阅读0次

    上学的时候就记住了下面这些:

    原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。
    机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。
    机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。

    当时并没有过度深究, 就只是记住而已。
    最近研究8位机-128的补码的时候深入学习了下,总结下。
    首先说一下补的概念,个人理解:
    对于一个时钟,7点,再过8个小时:
    7 + 8 = 15,也就是3点 即7 + 8 - 12 = 3;
    从数学的角度来看,上式等于7 + (8 - 12) = 3
    其含义就是先算出了8的补,然后加上这个数
    主要原因就是因为前面的相加操作发生了溢出(15 > 12)

    有这样一种说法,根本就没有符号位,最高位其实就是用来取模的 **
    https://www.zhihu.com/question/20159860
    感觉这个理解很到位
    即加法操作产生溢出后需要减去模值
    在补码运算中最高位用来
    表示模**,可以判断出原有的数是正数还是负数,所以变成了符号位,是自然形成的符号位

    00000001(补码),0000001(原码) - 00000000 (原码)= 0000001 即为1
    
    10000001(补码),0000001(原码) - 10000000 (原码)= 10000001 即为1-128 = -127,-127的补码就是10000001
    

    那么,-128的补码就是00000000(原码)-10000000(原码),最高位为0,其他位都为1

    还有一种理解方式:
    计算机中,8位,能表示256个数字是显然的
    0 - 255
    但是人们不满足于只能表示正数啊,所以要有负数存在
    而且计算机是不能执行减法操作的
    因此就有了原码的诞生,最高位用来做符号位
    但是,其中有一个问题就是计算机在执行加法操作的时候,如:

     1 + (-1) = 0;
    00000001 + 10000001 = 10000010
    

    结果却是-2,这显然不对啊
    所以就有了反码的诞生,专门用来处理负数,上述加法变为

    00000001 + 11111110 = 11111111
    

    而此时-0的反码即为1 1111111
    此时的表示范围为0 ~ 11111111
    所以能表示-127 ~ 127
    但是问题是此时还有一个+0的存在,其反码就是他自己
    这样子就带来一个问题就是有两个0的存在,表示方式还不一样。
    这个时候,我们发现-0(11111111) 加上1就变成1 00000000,由于最高位溢出,故此时值为+0,那么就将这个值定义为0,两个0的情况也没有了
    补码就是这个概念,即反码+1
    即整个环往前走了一步,其他数往前走了一步都有替代者,但是11111111往前一走就溢出了,变成了00000000
    所有的正负加减=0的操作本来都是-0,现在都是溢出然后取+0
    这样一来原本的所有值都在原本的反码的基础上+1,那么原本的

    -1的原码是10000001,反码是11111110,现在补码是11111111
    -127的原码是11111111,反码是10000000,现在补码是10000001
    

    那,既然都往前走了一位,那现在补码10000000表示谁呢?
    从-1到-127都有自己的反码和补码,也就是说,多出来一个数(两个0变成一个0产生的历史遗留问题),最高位还是1,所以就给了-128

    参考:https://www.zhihu.com/question/20159860/answer/71256667

    相关文章

      网友评论

          本文标题:计算机中的原码、反码、补码

          本文链接:https://www.haomeiwen.com/subject/ufunyttx.html