此代码是否总是评估为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
即使它们具有不同的位模式也需要它,因此这不成问题。刚刚替补~
使用-
。
这对所有和所有人都是正确的。x
y
+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语言阅读技能),这将使您获得答案。