1的补码和2的补码(二进制码)

这个在线计算器显示所输入的负整数的1的补码和2的补码

事实上,这个计算器显示任何整数的二进制代码,但这个代码取决于符号。对于正整数,计算器用其二进制表示。对于负整数,计算器显示的是1的补码(也称为反码)和2的补码(或简单的补码)。

你可以在计算器下面找到解释1的补码和2的补码背后的逻辑的文本

PLANETCALC, 1的补码和2的补码

1的补码和2的补码

范围
 
二进制代码
 
1的补码(反码)
 
2的补码(补码)
 

1的补码和2的补码

二进制代码 是无符号整数的二进制表示。 就计算机而论,有一定数量的位(二进制数字)用来表示数字。因此, n 位所能表示的总范围是 2^n

1的补码 或者 反码 是一个数字的反二进制代码。也就是说,所有的零变成了一,所有的一变成了零。

2的补码 或者 补码 逆码是+ 1

这到底是怎么回事?

这些代码的发明是为了使符号运算更加顺畅(对机器而言)。由于我是那种喜欢通过实例来学习的人,所以我将通过实例来解释这个问题。

假设我们有一台4位二进制数的计算机。4位可以表示的总范围是16,从0、1、…开始到15。以下是二进制表示:
00 - 0000
...
15 - 1111

但这些是无符号数,用处不大。我们需要引入一个符号。所以让我们取正数(8,包括0)范围的一半,取负数(也是8)范围的一半。请注意,与通常的数学不同,机器将零视为正数。

所以我们的正数是0,…,7,负的是-1,…,-8。

为了区分正数和负数,我们将最左边的位赋值为符号位 。符号位的零表示这是一个正数和一个负数。

正数由纯二进制代码表示:
7 - 0111
6 - 0110
...
1 - 0001
0 - 0000

但是负数怎么表示呢?1的补码和2的补码就出现了。

让我们看-7。它的绝对值是7,在二进制形式下,我们可以得到0111。1的补码是绝对值的位取反,所有的0变成1,所有的1变成0。所以,-7的补码或反码是1000。2的补码就是反码加1。 所以,-7 的2的补码是 1001。

请注意,二进制 1000 就是 8, 在给定 15 , 或者 2^n-1的情况下将被加到 7。 15 由二进制形式的 1111(所有位都是 1)表示,这就是名称 - 1的补码 - 它“补充”二进制代码到 2^n-1, (所有的 1)。

而二进制1001是9,它与-7相差16,即2^4 ,或者,这等同于,2的补码 "补充 "二进制代码到2^n,即7+9=16

后者被证明对机器计算非常有用—使用2的补码来表示负数,允许工程师使用加法方案进行加减法,从而简化了ALU(算术和逻辑单元—处理器的一部分)的设计。2的补码很容易检测到溢出位,以及没有足够的位来表示给定数字的情况。

几个实例

7-3=4

数字 表示为 二进制代码 1的补码 2的补码
被加数 7 0111 0111 N/A N/A
被加数 -3 1101 0011 1100 1101
总数 4 0100 0100 N/A N/A

-1+7=6

数字 表示为 二进制代码 1的补码 2的补码
被加数 -1 1111 0001 1110 1111
被加数 7 0111 0111 N/A N/A
总数 6 0110 0110 N/A N/A

溢出位是通过查看最后两个进位位来检测的,包括超出最右边位的进位位。如果进位位是11或00,就没有溢出位;如果进位位是01或10,就有溢出位。而且,如果没有溢出位,超过最右边位的进位位可以被安全地忽略掉。

带有进位位和第5位的例子(比最右位多一位)

7+1=8

数字 二进制代码
被加数 7 0111
被加数 1 0001
进位位 01110
结果 溢出位 01000

最后两个进位位是 01。这给出了溢出信号

-7+7=0

数字 二进制代码
被加数 -7 1001
被加数 7 0111
进位位 11110
结果 0 10000

结果加16 —但是第5位可以忽略;实际结果是0。最后两个是11。没有溢出位,所以正确的结果确实是0。

溢出位检查可以通过简单的XOR-ing两个最后进位位来完成。

由于这些方便的性质,2的补码是计算机上表示负数最常用的方法。

补充说明: 1的补码也可以用来表示负号,但加法方案应该使用循环进位,并且更加复杂。n位可以表示的范围减少了1,因为1111忙于倒成0000 -负零。所以,它不太方便。

URL 复制到剪贴板
PLANETCALC, 1的补码和2的补码(二进制码)

评论