我只是好奇,为了在二进制中表示-1,是否有一个原因,使用了2的补码:翻转位并加1?
-1由11111111(2的补码)表示,而不是(对我来说更直观)10000001,10000001是二进制1,第一位为负标志。
免责声明:我的工作不依赖二进制算术!
我只是好奇,为了在二进制中表示-1,是否有一个原因,使用了2的补码:翻转位并加1?
-1由11111111(2的补码)表示,而不是(对我来说更直观)10000001,10000001是二进制1,第一位为负标志。
免责声明:我的工作不依赖二进制算术!
当前回答
It's worthwhile to note that on some early adding machines, before the days of digital computers, subtraction would be performed by having the operator enter values using a different colored set of legends on each key (so each key would enter nine minus the number to be subtracted), and press a special button would would assume a carry into a calculation. Thus, on a six-digit machine, to subtract 1234 from a value, the operator would hit keys that would normally indicate "998,765" and hit a button to add that value plus one to the calculation in progress. Two's complement arithmetic is simply the binary equivalent of that earlier "ten's-complement" arithmetic.
其他回答
我们对加减法都只做加法运算。我们将第二个操作数与第一个操作数相加。对于减法,我们将第二个操作数的2的补数与第一个操作数相加。
对于2的补码表示,我们不需要单独的数字组件,只使用加法器和补法器。
有不同类型的表示,它们是:
无符号数表示 有符号数字表示 补体表示 二补体表示法
无符号数字表示,仅用于表示正数
有符号的数字表示,用来表示正数和负数。在有符号数表示中,MSB位表示符号位,其余位表示数字。当MSB为0时表示数字为正,当MSB为1时表示数字为负。
有符号数表示的问题是0有两个值。
补码表示法的问题是0有两个值。
但如果我们使用2的补体表示,那么0就只有一个值,这就是为什么我们用2的补体形式表示负数。
来源:负数为什么以二进制补码形式存储
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标准所允许的任何其他有符号表示时,结果的每一位都可能受到操作数的任何位的影响,这就需要将整个值一次保存在寄存器中,或者在计算之后进行额外的步骤,至少在某些情况下,需要读取、修改和重写结果的每个块。
使用2的补码是因为它更容易在电路中实现,也不允许负零。
如果有x位,2的补码范围从+(2^x/2+1)到-(2^x/2)。补码将从+(2^x/2)到-(2^x/2),但允许负数为零(0000在4位1的补码系统中等于1000)。
你的目的并不是把二进制数的所有位都颠倒过来。实际上就是用1减去每一位。这只是一个幸运的巧合,1减1得0,1减0得1。所以翻转位有效地执行了这个减法。
但为什么每个数字的差值都是1呢?你不是。您的实际目的是计算给定的二进制数与另一个具有相同位数但只包含1的二进制数的差值。例如,如果您的数字是10110001,当您翻转所有这些位时,您实际上是在计算(11111111 - 10110001)。
这解释了计算二的补的第一步。现在让我们在图中加入第二步——添加1。
将上述二进制方程加1:
11111111-10110001 + 1
你得到了什么?这样的:
100000000-10110001
这是最终方程。通过执行这两个步骤,你试图找到这个,最终的区别:二进制数减去另一个二进制数,多出一位,并且除最高位外都包含零。
但我们为什么要追求这种差异呢?好吧,从现在开始,我想你最好去读维基百科的文章。