
负数的补码是该数的反码最右加1
取反加一,通常是指:“原码取反加一”,其实,这是不对的。
求负数的补码,是有公式的:
补码 = 负数 + 2^n, n 是位数。
正数,不存在变换成补码的问题。
--------------------------
下面用 4 位二进制数来说明。
假设一个负的二进制数是:X =-xxxx。
其中的 xxxx,是二进制的绝对值,这也是一个正数。
按公式,[X]补 = -xxxx + 2^4
= -xxxx + 10000。
式中的 10000,可以写成:1111 + 1。
代入后,[X]补 = 1111-xxxx + 1。
式中的 1111-xxxx:
如果 x 是 0,1-x 就是 1。
如果 x 是 1,1-x 就是 0。
所以,1111-xxxx,就是【对绝对值取反】。
式中的 + 1:
就是在取反之后,再加上 1。
因此, X 的补码就是:【对绝对值取反、加一】。
--------------------------
注意:这里说的取反,只是对负数的绝对值 xxxx 取反。
在这里,既没有用原码,也没有用反码。更没有“符号位不变”。
所以,求补码,与“原码、反码和符号位”没有任何关系。
其实,原码反码符号位,都是无用的。
特别是-128,它根本就没有原码和反码!
只有用“绝对值取反加一”,才能求出-128 的补码。
那么,书上,总是讲“原码反码符号位”,有什么意思呢?
真是怪事。