一、首先二进制在计算机的内存中是以补码的形式存储
二、正数的补码=原码=反码,
负数的反码=原码的取反(二进制数的符号位除外,一般来说在二进制的左边的最高位)
负数的补码=反码+1
注意:
若已知补码为 1111 1000,如何求其原码呢?
1. 方法1:求负数 原码—>补码 的逆过程。
注意:符号位保持不变!
(A)先 - 1,得到 1111 0111
(B)取反(符号位保持不变,其他位置按位取反 ),得到 1000 1000
2. 方法2:
注意:符号位保持不变!
(A)将这个二进制数中(即 1111 1000),除了符号位,其余位置按位取反,得 1000 0111
(B)+ 1,得到 1000 1000
总结:-1 后,再取反 和 取反后,再+1 的效果是一样的,这就和 -(3-1) 和 (-3 +1) 是一个道理。
三、按位取反怎么算
按位取反:二进制的每一位都取反(符号位+数据位)
公式法:
~x=-(x+1)
举两个例子:~11=-(11+1)=-12
~(-11)=10
公式法的内部是如何计算的呢:
以~11为例:
~11的计算步骤:
- 计算11的补码
转二进制:0 1011
计算补码:0 1011 - 按位取反:1 0100 (按位取反是在这进行的,即补码的形式进行按位取反) 注意:这里是补码
- 将转为原码:
取其反码(因为补码是负数):1 1011
末位加一:1 1100 - 符号位为1是负数,即-12
以~(-11)为例:
~(-11)的计算步骤:
- 计算-11的补码
转二进制:1 1011
计算补码:1 0101 - 按位取反:0 1010 (按位取反是在这进行的,即补码的形式进行按位取反) 注意:这里是补码
- 将转为原码:
正数补码就是原码:0 1010 - 符号位为0是正数,即10