我只是好奇,为了在二进制中表示-1,是否有一个原因,使用了2的补码:翻转位并加1?
-1由11111111(2的补码)表示,而不是(对我来说更直观)10000001,10000001是二进制1,第一位为负标志。
免责声明:我的工作不依赖二进制算术!
我只是好奇,为了在二进制中表示-1,是否有一个原因,使用了2的补码:翻转位并加1?
-1由11111111(2的补码)表示,而不是(对我来说更直观)10000001,10000001是二进制1,第一位为负标志。
免责声明:我的工作不依赖二进制算术!
当前回答
A major advantage of two's-complement representation which hasn't yet been mentioned here is that the lower bits of a two's-complement sum, difference, or product are dependent only upon the corresponding bits of the operands. The reason that the 8 bit signed value for -1 is 11111111 is that subtracting any integer whose lowest 8 bits are 00000001 from any other integer whose lowest 8 bits are 0000000 will yield an integer whose lowest 8 bits are 11111111. Mathematically, the value -1 would be an infinite string of 1's, but all values within the range of a particular integer type will either be all 1's or all 0's past a certain point, so it's convenient for computers to "sign-extend" the most significant bit of a number as though it represented an infinite number of 1's or 0's.
Two's-complement is just about the only signed-number representation that works well when dealing with types larger than a binary machine's natural word size, since when performing addition or subtraction, code can fetch the lowest chunk of each operand, compute the lowest chunk of the result, and store that, then load the next chunk of each operand, compute the next chunk of the result, and store that, etc. Thus, even a processor which requires all additions and subtractions to go through a single 8-bit register can handle 32-bit signed numbers reasonably efficiently (slower than with a 32-bit register, of course, but still workable).
当使用C标准所允许的任何其他有符号表示时,结果的每一位都可能受到操作数的任何位的影响,这就需要将整个值一次保存在寄存器中,或者在计算之后进行额外的步骤,至少在某些情况下,需要读取、修改和重写结果的每个块。
其他回答
扩展一下其他的答案:
在two's complement中
加法与普通正整数加法的原理相同。 减法也不会变 乘法!
"组织"需要不同的机制。
所有这些都是正确的,因为2的补是普通的模算术,我们选择通过减去模来看待一些负数。
维基百科说明了一切:
二补系统的优点是不需要加减电路检查操作数的符号来决定是加还是减。这一特性使系统实现更简单,能够轻松地处理更高精度的算术。此外,零只有一种表示,避免了与负零相关的微妙之处,这种微妙之处存在于补体系统中。
换句话说,无论数字是否为负,加法都是一样的。
这是为了简化数字的和和和差。2的补数中一个负数和一个正数的和与正常方式的和是一样的。
使用2的补码是因为它更容易在电路中实现,也不允许负零。
如果有x位,2的补码范围从+(2^x/2+1)到-(2^x/2)。补码将从+(2^x/2)到-(2^x/2),但允许负数为零(0000在4位1的补码系统中等于1000)。
我们对加减法都只做加法运算。我们将第二个操作数与第一个操作数相加。对于减法,我们将第二个操作数的2的补数与第一个操作数相加。
对于2的补码表示,我们不需要单独的数字组件,只使用加法器和补法器。