我想知道这个说法,证明背后的逻辑。 C表达式-x,〜X + 1,和 - (X-1),都产生对于任意x相同的结果。我可以证明这是具体的例子真。我想证明这一点的方式有事情做与补的性质。有任何想法吗?

有帮助吗?

解决方案

时,请考虑将号码添加到其位补你会得到什么。一个n位的整数x的位元补具有1到处x的0,反之亦然。因此,它清楚地看到:

X +〜X = 0b11 ... 11(全1的n位值)

不管x比特的数量。此外,注意添加一个充斥着所有的人一个n位数将使其换到零。因此,我们看到:

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

其他提示

我不能肯定你可以从任何一种有用的公理比相当琐碎减少回,我们已经定义了现代整数ALU的负数在二进制补码的事实其他证明这一点。

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

所以我们建立一个发生在2的补码表示负数的机器。表达式显示补派代表负数是准确的,但仅仅是因为我们定义他们的方式。这是在现代机器的负整数公理基础。

由于我们在补来定义否定,你基本上指的是公理,但我想这就是所有的证据,最终做。

也许这就是为什么我不是一个真正的理论的人。 : - )

〜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' ..双向'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反转位之后使这种补偿。你可以很容易地确认使用+1-1在我们的2位的例子。

在一般这是不正确的,因为C标准不要求使用二进制补码表示负数。

在具体地,施加到〜有符号类型的结果没有定义。

不过,据我所知,所有的现代机器使用三三两两的整数补充。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top