这段代码是否总是会计算为false?两个变量都是二进制补码的有符号整数。
~x + ~y == ~(x + y)
我觉得应该有一些符合条件的数字。我尝试测试介于-5000
和5000
之间的数字,但从未达到相等的情况。是否有一种设置方程式以找到满足条件的解决方案?
将一个换成另一个会在我的程序中导致隐含的错误吗?
这段代码是否总是会计算为false?两个变量都是二进制补码的有符号整数。
~x + ~y == ~(x + y)
我觉得应该有一些符合条件的数字。我尝试测试介于-5000
和5000
之间的数字,但从未达到相等的情况。是否有一种设置方程式以找到满足条件的解决方案?
将一个换成另一个会在我的程序中导致隐含的错误吗?
假设反证法成立,存在某个 x
和某个 y
(mod 2n) 满足以下条件:
~(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
(mod 2n)而言,~(x+y) != ~x + ~y
。
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
。 - BlueRaja - Danny Pflughoeft在绝大多数计算机上,如果x
是整数,则-x
表示为~x + 1
。等价地,~x == -(x + 1)
。在方程中进行此替换得到:
这是一个矛盾,因此~x + ~y == ~(x + y)
始终为假。
尽管如此,事实上C语言不要求使用二进制补码,因此我们还必须考虑...
在一进制补码中,-x
表示为~x
。零是一个特殊情况,它具有所有0(+0
)和所有1(-0
)的表示方法,但我记得C语言要求+0 == -0
,即使它们具有不同的位模式,所以这不应该是问题。只需用-
替换~
即可。
这对于所有的x
和y
都是真的。
+0 == -0
。这是C语言中有意义的表达方式。 :) - Alex Lockwood只考虑x
和y
的最右边一位(例如,如果x == 13
是二进制中的1101
,我们只看最后一位,即1
),然后有四种可能的情况:
x = 0,y = 0:
左边:~0 + ~0 => 1 + 1 => 10
右边:~(0+0) => ~0 => 1
x = 0,y = 1:
左边:~0 + ~1 => 1 + 0 => 1
右边:~(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。~
操作? - hamstergene~x
和~y
与给定的匹配,它就适用于任何n。 - Karthik Kumar Viswanathan提示:
x + ~x = -1
(mod 2n)
假设问题的目标是测试您的数学能力(而不是阅读C规范的技能),这个方程式可以帮助您得到答案。
在补码表示法中,包括1的补码、2的补码(甚至42的补码),都可以被证明:
~x + ~y == ~(x + a) + ~(y - a)
现在让 a = y
,我们有:
~x + ~y == ~(x + y) + ~(y - y)
或:~x + ~y == ~(x + y) + ~0
因此,在二进制补码中,~0 = -1
这个命题是错误的。
而在一的补码中,~0 = 0
这个命题是正确的。
假设 MAX_INT
是由 011111...111
(无论有多少位)表示的整数。那么你知道,~x + x = MAX_INT
和 ~y + y = MAX_INT
,因此你可以确定 ~x + ~y
与 ~(x + y)
之间的差异是 1
。
C语言并不要求实现二进制补码。然而,对于无符号整数,类似的逻辑被应用。在这种逻辑下,差异将始终为1!
~x = (2^n - 1) - x
和~y = (2^n - 1) - y
会得到这个结果。
true
。 - Mysticial