为什么二进制数的补码等于按位取反再加1
哪有什么“按位取反加一”!
-128,并没有原码和反码,拿什么取反呢?拿什么加一?
补码,就是补码,与原码反码符号位,并无任何关系。
求补码,有它自己的“补码定义式”:
当 X >= 0, [ X ]补 = X; 零和正数不用变换。
当 X < 0, [ X ]补 = X + 2^n。 n 是补码的位数。
这是通用的公式。 一般的书上,都有这种公式,去翻翻书吧。
--------------------------
如果说“取反加一”,就应该是【绝对值取反加一】!
下面用 4 位二进制数来说明。
假设一个负的二进制数是:X =-xxxx。
其中的 xxxx,是二进制的绝对值,这就是一个正数。
按公式,[ X ]补 = X + 2^4,
二进制就是: = -xxxx + 1 0000。
式中的 1 0000,可以写成:1111 + 1。
代入后,[ X ]补 = 1111-xxxx + 1。
式中的 1111-xxxx:
如果 x 是 0, 1-x 就是 1。
如果 x 是 1, 1-x 就是 0。
所以,1111-xxxx,就是【对绝对值取反】。
式中的 + 1:
就是在取反之后,再加上 1。
因此, X 的补码就是:【对绝对值取反、加一】。
--------------------------
在这里,既没有用原码,也没有用反码。更没有“符号位不变”。
所以,求补码,与“原码、反码和符号位”没有任何关系。
其实,原码反码符号位,都是无用的。
特别是-128,它根本就没有原码和反码!
只有用【对绝对值取反加一】,才能求出-128 的补码。
那么,书上,总是讲“原码反码符号位”,有什么意思呢?
真是怪事。
昨天聊到了补码的问题:在4进制中,原码1的补码是3。减去原码和加上补码的结果是一样的。大学时候,对于二进制数,求补码有个口诀: 按位取反再加一 。
为什么呢?还是以4进制为例,为了直观起见,还是先把图贴上。
补码又可以表示为 进制能表达的最大数减去原码再加一 ,对于二进制表现形式能表达的最大数(不考虑负数)是多少? 3 。写成2进制是11。
因为3的每一位都是1,所以减去另一个数字时,跟取反的结果是一样的。剩下的例子也就不再赘述了。
还有一个在已知补码的情况下,还有一个获得原码的口诀叫: 按位取反再加一 。