[英]~x + ~y == ~(x + y) is always false?
此代碼是否總是評估為false? 這兩個變量都是兩個補碼簽名的整數。
~x + ~y == ~(x + y)
我覺得應該有一些數字滿足條件。 我嘗試測試-5000
到5000
之間的數字,但從未達到平等。 有沒有辦法建立一個方程來找到條件的解?
將一個換成另一個導致我的程序中的一個陰險的錯誤?
為了矛盾,假設存在一些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
(mod 2 n ), ~(x+y) != ~x + ~y
。
*值得注意的是,在具有一個補碼算術的機器上,相等實際上對於所有x
和y
。 這是因為在一個補碼下, ~x = -x
。 因此, ~x + ~y == -x + -y == -(x+y) == ~(x+y)
。
在絕大多數計算機上,如果x
是整數,則-x
表示為~x + 1
。 等價地, ~x == -(x + 1)
。 在你的等式中進行這種替換給出了:
這是一個矛盾,所以~x + ~y == ~(x + y)
總是假的 。
也就是說,小學生會指出C不需要兩個補碼,所以我們也必須考慮......
在一個補碼中 , -x
簡單地表示為~x
。 零是一種特殊情況,具有全0( +0
)和全-1( -0
)表示,但IIRC,C需要+0 == -0
即使它們具有不同的位模式,所以這不應該是一個問題。 只需用-
代替~
。
對於所有x
和y
都是如此 。
只考慮x
和y
的最右邊一點(IE。如果x == 13
,基數2是1101
,我們只看最后一位, 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規范技能),這應該可以幫助你找到答案。
在一個和兩個(甚至是42個)的補充中,這可以證明:
~x + ~y == ~(x + a) + ~(y - a)
現在讓a = y
,我們有:
~x + ~y == ~(x + y) + ~(y - y)
要么:
~x + ~y == ~(x + y) + ~0
因此在〜0 ~0 = -1
的二進制補碼中,命題是錯誤的。
在一個補碼中, ~0 = 0
,這個命題是正確的。
根據Dennis Ritchie的書,C默認不實現二進制補碼。 因此,您的問題可能並非總是如此。
設MAX_INT
為011111...111
表示的int(無論多少位)。 那么你知道, ~x + x = MAX_INT
和~y + y = MAX_INT
,因此你肯定知道~x + ~y
和~(x + y)
之間的差值是1
。
C不要求兩個補碼是實現的。 但是,對於無符號整數,應用類似的邏輯。 在這個邏輯下,差異總是1!
當然,C不需要這種行為,因為它不需要二進制補碼表示。 例如, ~x = (2^n - 1) - x
& ~y = (2^n - 1) - y
將得到此結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.