原码、反码和补码的概念
找出负数的补码、以及负数的补码表示的负数的两种方法
数的补码的常见问题是找一个数的补码,以及根据补码找出它表示的数。
由于正数的补码和原码、反码都是一样的,在十进制和二进制之间转换就可以解决上述两个问题。
难点在负数上面。一个负数的补码是什么,以及一个表示负数的补码到底表示的是哪个负数。
还好,有两种方法可以同时解决这两个问题。
为了演示这两种方法,我们先给出用4个比特进行补码编码的样本:
无符号 | 二级制 | 有符号 |
---|---|---|
7 | 0111 | 7 |
6 | 0110 | 6 |
5 | 0101 | 5 |
4 | 0100 | 4 |
3 | 0011 | 3 |
2 | 0010 | 2 |
1 | 0001 | 1 |
0 | 0000 | 0 |
15 | 1111 | -1 |
14 | 1110 | -2 |
13 | 1101 | -3 |
12 | 1100 | -4 |
11 | 1011 | -5 |
10 | 1010 | -6 |
9 | 1001 | -7 |
8 | 1000 | -8 |
方法1.
找出负数的补码
先找出作为它相反数的正数的补码,得到正数补码后,从低位向高位搜寻第一个1,第一个1和前面的低位比特(都是0)不变,而1后面的所有更高位比特取反(0变成1,1变成0),就得到原负数的补码了。比如,找-4的补码,先找4的补码,为0100,从低位向高位找1,为100,不变,后面的更高位取反,得到1100,它就是-4的补码。
3 | 2 | 1 | 0 | |
---|---|---|---|---|
4的补码 | 0 | 1 | 0 | 0 |
↓ | 取反 | 不变 | 不变 | 不变 |
-4的补码 | 1 | 1 | 0 | 0 |
根据补码确定它表示哪个负数
由负数的补码判定它表示哪个负数的过程和上述过程类似,从低位向高位搜寻第一个1,第一个1和前面的低位比特(都是0)不变,而1后面的高位比特取反(0变成1,1变成0),会得到一个正数的补码。那么原先的补码表示的负数就是这个正数的相反数。比如,补码为1100,显然最高位为1,是负数的补码,从低位向高位找1,为100,不变,后面的更高位取反,得到0100,是4的补码,于是1100就是-4的补码。
3 | 2 | 1 | 0 | |
---|---|---|---|---|
负数的补码 | 1 | 1 | 0 | 0 |
↓ | 取反 | 不变 | 不变 | 不变 |
为4的补码,说明1100为-4的补码 | 0 | 1 | 0 | 0 |
方法2.
找出负数的补码
先找出作为它相反数的正数的补码,得到正数补码后,对他进行取反,得到的二进制数再加1,即为该负数的补码。比如,找-4的补码,先找4的补码,为0100,取反,得到1011,再加1,得到1100,即为-4的补码。
3 | 2 | 1 | 0 | |
---|---|---|---|---|
4的补码 | 0 | 1 | 0 | 0 |
↓ | 取反 | 取反 | 取反 | 取反 |
取反结果 | 1 | 0 | 1 | 1 |
加1 | 0 | 0 | 0 | 1 |
-4的补码 | 1 | 1 | 0 | 0 |
根据补码确定它表示哪个负数
由负数的补码判定它表示哪个负数的过程与上述过程类似,把表示负数的补码取反,加1,得到正数的补码,那么原先的补码表示的负数就是这个正数的相反数。
3 | 2 | 1 | 0 | |
---|---|---|---|---|
补码 | 1 | 1 | 0 | 0 |
↓ | 取反 | 取反 | 取反 | 取反 |
取反结果 | 0 | 0 | 1 | 1 |
加1 | 0 | 0 | 0 | 1 |
为4的补码,说明1100为-4的补码 | 0 | 1 | 0 | 0 |