上来先敲黑板,说重点(重要的事情说三遍):
- 计算机中以补码进行存储计算
- 计算机中以补码进行存储计算
- 计算机中以补码进行存储计算
所以,一切的运算都要先得到数据的补码,不要上来就拿原码在那干,得到的结果会漫天飞舞,正负数一起算会算到你怀疑人生。。可以尝试将十进制数字的二进制打印出来看看,正数还算正常,负数的那玩意是什么鬼(e.g.
-3=11111111111111111111111111111101
)。。
正数
正数的原码、反码和补码都一样(不要问我为什么,就是这么规定的。。我也很无奈啊。。)
负数
负数的反码是符号位不变,其余为取反。负数的补码是其反码加一。
负数的计算方式,注意这里是算负数即计算(~X + 1
),以计算8
的负数为例:
8
的二进制表示为1000
,由于是正数,手动在前面补零,变为:01000
- 由于正数的补码为本身,所以其补码为:
01000
- 取反运算:
01000
按位取反,得到10111
,那么10111
是哪个幸运儿的补码呢?- 由于正数的补码最高位肯定是
0
,而此时的10111
最高位为1
,那么它铁定是一个负数的补码- 负数的补码计算方式是:原码->除最高位外按位取反得反码->反码加一
- 反之,求原码的方式就变为:补码减一->除最高位外按位取反
10111
,减一得到10110
,除最高位按位取反:11001
,即-9
- 结果就出来了:
-9 + 1 = -8
,即-X = ~X + 1
补充
还有需要说明的一点,以正数
6
为例,它的二进制是0110
,加上一位符号位,标记为00110
(标记一位和补全为8
位似乎都一样,我习惯多加一位,好理解),由于正数的反码和补码都与原码相同,所以6的反码和补码都是00110
。但是~6
的结果是-7
。这里需要注意,反码 与 取反 并不是一回事。另外取反和负数也不是一回事。
注意逻辑思维:对于正数
A
求(~A
)的过程是:A
转二进制,求到A
的补码,按位取反,假定得到的结果是X
,那么X
是要求的结果B
的补码,接下来就要想办法求B
。即公式:A补反 = B补
附录
~9的计算步骤:
转二进制:0 1001
计算补码:0 1001
按位取反:1 0110
_____
转为原码:
按位取反:1 1001
末位加一:1 1010
符号位为1是负数,即-10
--snip--
~-9的计算步骤:
转二进制:1 1001
计算补码:1 0111
按位取反:0 1000
_____
转为原码:
正数的补码和原码相同,仍为:0 1000,即8