如何证明C语句-x,~x + 1和〜(x-1)产生相同的结果?

Ben*_*sen 4 c proof twos-complement

我想知道这个陈述背后的逻辑,证据.对于任何x,C表达式-x,~x + 1和〜(x-1)都产生相同的结果.我可以证明这对于具体的例子是正确的.我认为证明这一点的方法与两个补码的属性有关.有任何想法吗?

Jul*_*tta 13

考虑将数字添加到其按位补码时得到的结果.n位整数x的按位补码具有1,其中x具有0,反之亦然.所以很明显看到:

x + ~x = 0b11 ... 11(所有1的n位值)

无论x中的位数如何.此外,请注意,向填充了所有1的n位数添加1将使其换行为零.因此,我们看到:

x + ~x + 1 = 0b11 ... 11 + 1 = 0且~x + 1 = -x.

同样,注(x - 1)+〜(x - 1)= 0b11 ... 11.然后(x-1)+〜(x-1)+ 1 = 0,并且〜(x-1)= -x.

  • 一个非常优雅的证明.我喜欢! (2认同)

Dig*_*oss 6

我不确定你可以从任何有用的公理证明这一点,除了相当简单的减少回到我们已经在现代整数ALU中定义负数以二进制补码的事实.

计算机不具备与二进制补码硬件实现,它只是有各种吸引人的特性,几乎一切都建立了这样的这些日子.(但不是浮点!这是一个补充!)

因此,我们构建了一个恰好代表2的补码的负数的机器.显示负数以二进制补码表示的表达式是准确的,但这仅仅是因为我们以这种方式定义它们.这是现代机器中负整数的公理基础.

既然我们用二元补语来定义否定,那么你实际上指的是公理,尽管我认为这就是所有证明最终的作用.

也许这就是为什么我不是一个理论家.:-)

  • 我正在投票.C标准中没有要求使用2的补码.它只是允许的编码方案的一个. (4认同)