我只是好奇,为了在二进制中表示-1,是否有一个原因,使用了2的补码:翻转位并加1?
-1由11111111(2的补码)表示,而不是(对我来说更直观)10000001,10000001是二进制1,第一位为负标志。
免责声明:我的工作不依赖二进制算术!
我只是好奇,为了在二进制中表示-1,是否有一个原因,使用了2的补码:翻转位并加1?
-1由11111111(2的补码)表示,而不是(对我来说更直观)10000001,10000001是二进制1,第一位为负标志。
免责声明:我的工作不依赖二进制算术!
当前回答
这样加法就不需要任何特殊的逻辑来处理负数了。在维基百科上查看这篇文章。
假设有两个数,2和-1。在表示数字的“直观”方式中,它们将分别为0010和1001(我坚持使用4位的大小)。两者互为补足,分别是0010和1111。现在,假设我想把它们相加。
2的补语加法非常简单。你通常加数字,任何进位在最后被丢弃。所以它们相加如下:
0010
+ 1111
=10001
= 0001 (discard the carry)
0001是1,这是“2+(-1)”的预期结果。
但在你的“直观”方法中,添加更复杂:
0010
+ 1001
= 1011
等于-3,对吧?简单的加法在这种情况下行不通。你需要注意,其中一个数字是负的,如果是这种情况,就使用不同的算法。
对于这种“直观的”存储方法,减法是一种不同于加法的操作,在加法之前需要对数字进行额外的检查。由于您希望最基本的操作(加法、减法等)尽可能快,因此需要以允许您使用尽可能简单的算法的方式存储数字。
此外,在“直观”存储方法中,有两个0:
0000 "zero"
1000 "negative zero"
它们直观上是相同的数字,但存储时有两个不同的值。每个应用程序都需要采取额外的步骤来确保非零值也不是负零。
以这种方式存储int型还有另一个好处,那就是当你需要扩展存储值的寄存器的宽度时。对于2的补数,在8位寄存器中存储一个4位数就是重复它的最高位:
0001 (one, in four bits)
00000001 (one, in eight bits)
1110 (negative two, in four bits)
11111110 (negative two, in eight bits)
这只是观察小单词的符号位,然后重复它,直到它赶上大单词的宽度。
使用你的方法,你需要清除现有的位,这是一个额外的操作,除了填充:
0001 (one, in four bits)
00000001 (one, in eight bits)
1010 (negative two, in four bits)
10000010 (negative two, in eight bits)
在这两种情况下,您仍然需要设置额外的4位,但在“直观”情况下,您还需要清除第5位。这是每个应用程序中最基本和最常见操作之一中的一个小小的额外步骤。
其他回答
用补法执行减法的优点是减少了硬件 的复杂性。不需要不同的数字电路来进行加减法运算 加法和减法只能由加法器执行。
该操作的通常实现是“翻转位并加1”,但有另一种定义它的方式可能使其原理更清楚。2的补数是通常的无符号表示形式,其中每一位控制2的下一次方,并使最有效项为负。
取8位值a7 a6 a5 a4 a3 a2 a1 a0
通常的无符号二进制解释是: 27*a7 + 26*a6 + 25*a5 + 24*a4 + 23*a3 + 22*a2 + 21*a1 + 20*a0 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255
两人的补充解释是: -27*a7 + 26*a6 + 25*a5 + 24*a4 + 23*a3 + 22*a2 + 21*a1 + 20*a0 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
其他任何位都不会改变含义,并且进位到a7是“溢出”,不期望工作,所以几乎所有的算术操作都可以工作而不需要修改(正如其他人所注意到的)。符号大小通常检查符号位,并使用不同的逻辑。
这样加法就不需要任何特殊的逻辑来处理负数了。在维基百科上查看这篇文章。
假设有两个数,2和-1。在表示数字的“直观”方式中,它们将分别为0010和1001(我坚持使用4位的大小)。两者互为补足,分别是0010和1111。现在,假设我想把它们相加。
2的补语加法非常简单。你通常加数字,任何进位在最后被丢弃。所以它们相加如下:
0010
+ 1111
=10001
= 0001 (discard the carry)
0001是1,这是“2+(-1)”的预期结果。
但在你的“直观”方法中,添加更复杂:
0010
+ 1001
= 1011
等于-3,对吧?简单的加法在这种情况下行不通。你需要注意,其中一个数字是负的,如果是这种情况,就使用不同的算法。
对于这种“直观的”存储方法,减法是一种不同于加法的操作,在加法之前需要对数字进行额外的检查。由于您希望最基本的操作(加法、减法等)尽可能快,因此需要以允许您使用尽可能简单的算法的方式存储数字。
此外,在“直观”存储方法中,有两个0:
0000 "zero"
1000 "negative zero"
它们直观上是相同的数字,但存储时有两个不同的值。每个应用程序都需要采取额外的步骤来确保非零值也不是负零。
以这种方式存储int型还有另一个好处,那就是当你需要扩展存储值的寄存器的宽度时。对于2的补数,在8位寄存器中存储一个4位数就是重复它的最高位:
0001 (one, in four bits)
00000001 (one, in eight bits)
1110 (negative two, in four bits)
11111110 (negative two, in eight bits)
这只是观察小单词的符号位,然后重复它,直到它赶上大单词的宽度。
使用你的方法,你需要清除现有的位,这是一个额外的操作,除了填充:
0001 (one, in four bits)
00000001 (one, in eight bits)
1010 (negative two, in four bits)
10000010 (negative two, in eight bits)
在这两种情况下,您仍然需要设置额外的4位,但在“直观”情况下,您还需要清除第5位。这是每个应用程序中最基本和最常见操作之一中的一个小小的额外步骤。
维基百科说明了一切:
二补系统的优点是不需要加减电路检查操作数的符号来决定是加还是减。这一特性使系统实现更简单,能够轻松地处理更高精度的算术。此外,零只有一种表示,避免了与负零相关的微妙之处,这种微妙之处存在于补体系统中。
换句话说,无论数字是否为负,加法都是一样的。
我们对加减法都只做加法运算。我们将第二个操作数与第一个操作数相加。对于减法,我们将第二个操作数的2的补数与第一个操作数相加。
对于2的补码表示,我们不需要单独的数字组件,只使用加法器和补法器。