补码(2’s complement)是计算机用于表示诸如 +20,-17 这样有符号整数的方式。如在 C 语言中(或者许多其他的静态类型语言),整形数据类型 int
代表长度为 4-Bytes (32-bits) 的有符号数,可表示的范围为 [ − 2 31 , 2 31 − 1 ] [-2^{31}, 2^{31} - 1] [−231,231−1],这个范围里的数字有正有负,都是有符号数,而他们在计算机中就是通过补码来表示的。在这些有符号数里正数的补码与我们的直觉相同,但负数的补码形式需要一些转换,本文介绍如何得到一个数的补码,如何读懂补码以及补码内在的原理。
得到补码
-30 在计算机中是如何表示的呢?首先我们认为它是一个有符号整数,那么在计算机中就是用补码表示的,如何得到它对应的补码形式?首先给出结论:按位取反再加一,下面以 8-bits ,即八位二进制位为例,计算-30 的补码:
先写出 30 的二进制形式
0 0 0 1 1 1 1 0
按位取反
1 1 1 0 0 0 0 1
再加一
1 1 1 0 0 0 1 0
这就是 -30 的补码
30 与我们的直觉相同,就是 30 的二进制形式 0 0 0 1 1 1 1 0
。
读懂补码
如果给我们一个补码,例如上文得到的 -30 的补码,我们如何能知道这个补码表示的数是多少呢,同样,这里先给出结论:若补码最高位为 0,则代表是正数,可直接按照正常步骤转化为十进制,就像上文得到的 30 的补码就是