我们都知道通常负数在内存中表示作为这样的解释为什么X = =〜(〜X + 1)+ 1(二进制补码和背部!)
from x to ~x + 1
,并获得二的补数回到我们不这样做明显的东西一样
~([~x + 1] - 1)
而是我们做
~[~x + 1] + 1
有人可以解释为什么它总是工作?我想我可以用1位,2位,3位数来证明它,然后使用数学归纳法,但它并不能帮助我理解它的工作原理。
谢谢!
我们都知道通常负数在内存中表示作为这样的解释为什么X = =〜(〜X + 1)+ 1(二进制补码和背部!)
from x to ~x + 1
,并获得二的补数回到我们不这样做明显的东西一样
~([~x + 1] - 1)
而是我们做
~[~x + 1] + 1
有人可以解释为什么它总是工作?我想我可以用1位,2位,3位数来证明它,然后使用数学归纳法,但它并不能帮助我理解它的工作原理。
谢谢!
反正也是这样。那就是~x + 1 == ~(x - 1)
。但现在让我们把它放在一边。
f(x) = ~x + 1
是它自己的逆。证明:
~(~x + 1) + 1 =
(definition of subtraction: a - b = ~(~a + b))
x - 1 + 1 =
(you know this step)
x
此外,~x + 1 == ~(x - 1)
。为什么?那么,
~(x - 1) =
(definition of subtraction: a - b = ~(~a + b))
~(~(~x + 1)) =
(remove double negation)
~x + 1
和减法,a - b = ~(~a + b)
的是(略有不同寻常的)定义是什么?
~(~a + b) =
(use definition of two's complement, ~x = -x - 1)
-(~a + b) - 1 =
(move the 1)
-(~a + b + 1) =
(use definition of two's complement, ~x = -x - 1)
-(-a + b) =
(you know this step)
a - b
这是因为如果你增加〜x(假设没有溢出)。然后将其转换回x,相对于x增加,但相对于x递减。反之亦然。假设你的变量x有一个特定的值,每当你增加它时,相对于〜x,你会注意到它减少。
从程序员的角度来看,这是你本质上见证的。
Let short int x = 1 (0x0001)
then ~x = 65534 (0xFFFE)
~x + 1 = 65534 + 1 (0xFFFF)
~(~x+1) = 0 (0x0000)
~(~x+1) + 1 = 0 + 1 (0x0001)
多数民众赞成在完美。我正在努力去除那里正确的括号。我在哪里可以读到关于减法更详细的定义? –
@SolarDia我不知道,但我也增加了一个证明,但也许它现在略微圆了.. – harold
谢谢你先生,它不是圆形的,它看起来非常一致。 二的补码的定义 - >减法的定义 - >〜(〜x + 1)+ 1 == x 不确定它是否公平,但我喜欢这样)当我得到足够的声望时会提出这个评论。 –