二进制中补码的理解

  先从熟悉的十进制说起:1,2,3,4,5,6,7,8,9代表正数(前面+号可以省略),-1,-2,-3,-4,-5,-6,-7,-8,-9代表复数,0唯一。其中,前面的+号和-号代表的实际上是人为规定分别代表正数和负数,后面的数进行数值运算。两个正数相加仍是正数,两个负数相加仍是负数,一个正数一个负数相加,则比较绝对值大小,前面符号位为绝对值更大的那个。

  再说二进制中,为了区分正数和负数,编码时第一位作为符号位,0代表正数,1代表负数。

  按最初的想法,举个例子,比如+4,+5用二进制表示:

  0 0100  0 0101

  -4,-5用二进制表示:

  1 0100  1 0101

  但此时发现一个问题,4+(-4),5+(-5)应该都是0,但两者的相加结果却是不一样的,实际上,在这种规则下,0也是不唯一的:会有+0,-0出现,这显然是不合理的,这本质上是因为前面的符号位实际上是码制,但却参与了数值运算,两种不同规则的运算掺杂所导致的,为了解决这个问题,就必须让符号位也同时作为一个权值,参与到数值运算中来。1仍代表负数,0代表正数。符号位的权重为-2^(N-1),这样才能实现负数,其余为为正的权值,其余位依次为:2^(N-2),...,2^1,2^0。

  以4位二进制补码为例,负数为1000~1111,代表-8到-1,0000代表0,0001~0111代表1到7,一共16位。此时,我们取+5,-5相加,结果为0101+1011=0,此时的0是唯一的。这样,最高位仍能代表符号位,同时也可以参与数值运算。

  此外,正数的补码与原码相同,+5:0 0101  -5:1 1011 ,负数的补码为数值位每位取反,然后+1即可。

posted @ 2022-05-27 14:59  Real马锥  阅读(826)  评论(0编辑  收藏  举报