簡體   English   中英

如何證明 C 語句 -x、~x+1 和 ~(x-1) 產生相同的結果?

[英]How to prove that the C statement -x, ~x+1, and ~(x-1) yield the same results?

我想知道這句話背后的邏輯,證明。 C 表達式 -x、~x+1 和 ~(x-1) 對任何 x 都產生相同的結果。 對於具體的例子,我可以證明這是真的。 我認為證明這一點的方法與補碼的性質有關。 有任何想法嗎?

考慮將一個數添加到其按位補碼時會得到什么。 n 位整數 x 的按位補碼在 x 為 0 處處為 1,反之亦然。 所以很明顯:

x + ~x = 0b11...11(所有 1 的 n 位值)

與 x 中的位數無關。 此外,請注意,將 1 添加到填充為所有 1 的 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相當於-x的2的補碼+1(即負數)的表示,~(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'..bi'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反轉位之后進行了這種補償。 您可以在我們的 2 位示例中使用+1-1輕松驗證。

一般來說,這是不正確的,因為 C 標准不需要使用二進制補碼來表示負數。

特別是,未定義將 ~ 應用於有符號類型的結果。

但是,據我所知,所有現代機器都對整數使用二進制補碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM