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

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

考虑将数字添加到其按位补码时得到的结果。 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。

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

计算机不必使用二进制补充二进制硬件来实现,只是存在各种有吸引力的属性,而且几乎所有东西都是以这种方式构建的。 (但不是浮点!这是一个补充!)

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

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

也许这就是为什么我不是一个理论家。 🙂

~x + 1相当于2的补码+ 1(即负数)-x表示,〜(x-1)也表示相同(考虑最后一位为1,〜(x-1)=〜的情况( b1b2.b(n-1)1 – 0)= b1’b2’… b(n-1)’1 = b1’b2’… b(n-1)’0 + 1 = ~x + 1.最后一位的类似情况保持为0.~(x-1)=〜(b1b2..bi100..00-1)= ~b1b2..bi011..11 = b1’b2′.. bi’100。 .00 = b1’b2′.. bi’011..11 + 1 = ~x + 1。

我将尝试提供一个直观的解释,每个人都应该找到方便的。 如果你坚持我们可能会尝试更正式的方法。

在二元补码表示中,为了得到零元素的唯一表示,我们牺牲了一个正元素。 结果,有一个没有正镜的额外负数。

因此,给定2位,我们得到: {+1, 0, -1, -2} ,它将以二进制表示为:

 -2 10 -1 11 0 00 +1 01 

所以,我们可能会认为零作为一面镜子。 现在,给定一个整数x,如果我们想要反转它的符号,我们可以从反转所有位开始。 如果积极和消极之间没有零,那就足够了。 但是,由于零点发生了变化,因此我们可以对此进行补偿。

问题中提到的两个表达式在~(x-1)~x+1之后对这些位进行反转。 您可以在我们的2位示例中轻松validation使用+1-1

通常情况并非如此,因为C标准不要求使用二进制补码来表示负数。

特别是,没有定义将〜应用于有符号类型的结果。

但是,据我所知,所有现代机器都使用二进制补码整数。