此代码是否总是评估为false?这两个变量都是二进制补码整数。
~x + ~y == ~(x + y)
我觉得应该有一些数字可以满足条件。我尝试测试之间的数字-5000,5000但从未实现平等。有没有办法建立方程式来找到条件的解?
将一个交换为另一个会在我的程序中引起隐患吗?
true即使他们永远不能假设严格的二进制补码,它也有可能返回。
此代码是否总是评估为false?这两个变量都是二进制补码整数。
~x + ~y == ~(x + y)
我觉得应该有一些数字可以满足条件。我尝试测试之间的数字-5000,5000但从未实现平等。有没有办法建立方程式来找到条件的解?
将一个交换为另一个会在我的程序中引起隐患吗?
true即使他们永远不能假设严格的二进制补码,它也有可能返回。
Answers:
为了矛盾,假设存在x一些y(mod 2 n)使得
~(x+y) == ~x + ~y
用二进制补码*,我们知道,
-x == ~x + 1
<==> -1 == ~x + x
注意到这个结果,我们有
~(x+y) == ~x + ~y
<==> ~(x+y) + (x+y) == ~x + ~y + (x+y)
<==> ~(x+y) + (x+y) == (~x + x) + (~y + y)
<==> ~(x+y) + (x+y) == -1 + -1
<==> ~(x+y) + (x+y) == -2
<==> -1 == -2
因此,存在矛盾。因此,~(x+y) != ~x + ~y对于所有x和y(mod 2 n)。
*有趣的是,在具有补码算术的机器上,等式实际上对所有x和成立y。这是因为在一个人的补充下~x = -x。因此,~x + ~y == -x + -y == -(x+y) == ~(x+y)。
~x == -(x+1),那么~(x+y) == ~x + ~y意味着-(x+y+1) == -(x+1) + -(y+1)暗示-1 == -2
在绝大多数计算机上,如果x是整数,则-x表示为~x + 1。等效地,~x == -(x + 1)。在等式中进行此替换将得出:
这是一个矛盾,所以~x + ~y == ~(x + y)总是错误的。
也就是说,学徒们会指出C不需要补码,因此我们还必须考虑...
在一个补,-x简直是表示为~x。零是一种特殊情况,同时具有全0的(+0)和全1的(-0)表示,但是IIRC,C +0 == -0即使它们具有不同的位模式也需要它,因此这不成问题。刚刚替补~使用-。
这对所有和所有人都是正确的。xy
+0 == -0。终于在C.中有意义的事情了:)
只考虑两者的最右边位x和y(即,如果,x == 13这是1101在基地2个,我们只看到了最后一位,一个1那么有四种可能的情况下):
x = 0,y = 0:
LHS:〜0 +〜0 => 1 + 1 => 10
RHS:〜(0 + 0)=>〜0 => 1
x = 0,y = 1:
LHS:〜0 +〜1 => 1 + 0 => 1
RHS:〜(0 + 1)=>〜1 => 0
x = 1,y = 0:
由于这是家庭作业,因此我将由您自己决定(提示:这与之前的x和y交换相同)。
x = 1,y = 1:
我也会把这个交给你。
您可以证明,在给定任何可能输入的情况下,等式的左手侧和右手侧最右边的位将始终是不同的,因此您证明了两侧不相等,因为它们至少具有被翻转的一位彼此。
如果位数为n
~x = (2^n - 1) - x
~y = (2^n - 1) - y
~x + ~y = (2^n - 1) +(2^n - 1) - x - y => (2^n + (2^n - 1) - x - y ) - 1 => modulo: (2^n - 1) - x - y - 1.
现在,
~(x + y) = (2^n - 1) - (x + y) = (2^n - 1) - x - y.
因此,它们总是不相等,相差1。
~对非固定宽度数字的运算?
暗示:
x + ~x = -1(mod 2 n)
假设问题的目标是测试您的数学(而不是您的C语言阅读技能),这将使您获得答案。