这是在计算机中表示有符号整数的方法之一。在这种方法中,最高有效位(MSD)具有额外的含义。
如果MSD为0,我们可以评估该数字,就像解释任何普通的无符号整数一样。
如果MSD为1,则表示数字为负。
其他位指示数字的大小(绝对值)。
如果数字为负,则其他位表示数字幅度的1的补码。
假定字长为4位,一些带符号的十进制数及其等价的1的补码表示如下。
签名十进制 | 1的补码 |
---|---|
+6 | 0110 |
-6 | 1001 |
+0 | 0000 |
-0 | 1111 |
+7 | 0111 |
-7 | 1000 |
从上表可以明显看出,如果字长为n位,则可以表示的数字范围为-(2 n- 1-1)到+(2 n-1 -1)。显示了字长和可表示的1的补码范围的表格。
字数 | 1的补码范围 |
---|---|
4 | -7至+7 |
8 | -127至+127 |
16 | -32767至+32767 |
32 | -2147483647至+2147483647 |
使用计算机添加数字(+5)和(-3)。假定数字使用4位1的补码表示。
1110 <- carry generated during addition 0101 <- (+5) First Number + 1100 <-(-3) Second Number 0001 <- (+1) Sum
计算机没有给出正确的答案+1 = 0001,而是给出了正确的答案+2 = 0010!但是,要获得正确的答案,计算机将必须简单地将生成的最终进位添加到结果中,如下所示。
0001 + 1 0010 = (+2) Result
使用计算机将数字(-4)和(+2)相加。假定数字使用4位1的补码表示。
0010 <- carry generated during addition 1011 <- (-4) First Number + 0010 <-(+2) Second Number 1101 <- (-2) Sum
添加最后一个数组后,结果仍为1101。这是-2,这是正确的答案。在1 101中,MSB为1。这表示数字为负。然后,其余位不直接提供幅度。要解决此问题,只需考虑1的1的补数。1 101的1的补数就是0 010,即+2。因此,作为1010的1的补码的1101为-2。
1的补码表示法不是很容易理解,因为它与表示带符号数字的常规方式有很大不同。
另一个缺点是0有两个符号(0000和1111),这在计算机要测试0结果时非常不便。
计算机执行算术非常方便。为了在加法之后得到正确的答案,必须将加法的结果和最终进位相加。
因此,1的补码符号通常也不用于表示计算机内部的带符号数字,因此2的补码概念已经出现。