1的补码和2的补码(二进制码)
这个在线计算器显示所输入的负整数的1的补码和2的补码
事实上,这个计算器显示任何整数的二进制代码,但这个代码取决于符号。对于正整数,计算器用其二进制表示。对于负整数,计算器显示的是1的补码(也称为反码)和2的补码(或简单的补码)。
你可以在计算器下面找到解释1的补码和2的补码背后的逻辑的文本
1的补码和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 , 或者 的情况下将被加到 7。 15 由二进制形式的 1111(所有位都是 1)表示,这就是名称 - 1的补码 - 它“补充”二进制代码到 , (所有的 1)。
而二进制1001是9,它与-7相差16,即 ,或者,这等同于,2的补码 "补充 "二进制代码到,即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 -负零。所以,它不太方便。
评论