正数的补码等于原码
负数的补码等于符号位不变,数值位的反码+1
如果要算-8的补码的话:
(1)如果用4位二进制数表示的话,原码1000(“1”表示“-”号,“000”可以看成数字位“111”+1的结果)——反码1111——补码1000。(2)如果用8位二进制数表示的话,原码1000 1000——反码1111 0111
——补码1111 1000。
以上为思考过程,但是要注意:4位二进制数表示的范围是:原码-7到7(其中0有两种表示),反码也是-7到7(其中0有两种表示),而补码是-8到7(反码中的负数移1位,空出一个位置给-8)。即是说,在4位二进制表示中,-8只有补码,没有原码和反码。同理,在5位二进制表示中,-16只有补码10000,没有原码和反码。在3位二进制表示中,-4只有补码100,没有原码和补码。在2位二进制中,-2只有补码10,-1补码为11,0的补码为00,1的补码为01。
更一般地讲,补码的引入是为了表示符号数。比如4位二进制补码,可以表示的数的范围是-8到7,其中0000到0111依次对应着0到7,1000到1111依次对应着-8到-1,前面的符号位0和1可以看成是对两个容器的编号,容器“0”放非负数,容器“1”放负数,而且补码数值增加对应的数本身大小也增加(这一点至关重要)。正因为补码加1,对应的数字也在循环区间(如-8到7)中加1,从而使得补码加减法和真实数字可以直接对应。
再更一般讲:原码,反码,补码,本质上都是对同一个01字符串的不同理解方式。我们学的这三个概念,也就是01字符串的三种对应关系(就如同3种映射,3个函数)。除了这三种码,我们也可以根据需要,去定义自己的码。