首页 文章

解释为什么x ==〜(~x 1)1(两个补码并返回!)

提问于
浏览
4

众所周知,内存中的负数通常表示为两个补码数

from x to ~x + 1

并且要回去,我们不会做明显的事情

~([~x + 1] - 1)

但相反,我们做到了

~[~x + 1] + 1

有谁可以解释为什么它总是有效?我想我可以用1位,2位,3位数证明它,然后使用数学归纳法,但它无法帮助我理解它是如何工作的 .

谢谢!

2 回答

  • 1

    无论如何,这是一回事 . 那就是 ~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
    
  • 3

    这是因为如果你增加~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)
    

相关问题