補碼正確性的證明

2021-08-07 14:55:46 字數 2784 閱讀 7738

雖然不知道大牛怎麼想到這樣解決補碼的正負表示問題1,但這種解決辦法的正確性倒是可以嘗試證明一下。

首先需要明確什麼叫正確性,充要條件暫時沒有想到,先列舉幾個必要條件,至少這些條件需要能成立:

本身的值表示正確

本身的符號表示正確

運算結果的值表示正確

運算結果的符號表示正確

接下來證明每乙個條件:

一定正確,左邊加一位對值來說是完全不影響的,可以從兩個角度分析

左邊加1就等於加了乙個模

左邊是高位,本身的運算只會向高位進製,完全不會影響低位的運算

只要用這個符號系統表示,就會自然正確

沒想到好辦法,只能分情況討論。

1)值的位運算不溢位

兩個正數符號一致

數學結果:兩個正數相加還是正數,符號一定為正

位運算結果:因為值的位運算不溢位,兩個0相加還是0,也就是正

兩個負數情況不存在

數學結果:符號一定為負

位運算結果:值的位運算不溢位,兩個1相加進一位得到0,也就是正

看起來兩個結果的符號一定不一致。但其實可以證明這種「值的位運算不溢位」情況下「數**算結果一定溢位」,而數**算結果溢位的情況不用考慮,我們不保證這種情況下運算結果的正確性

證明:

假設負數a的補碼表示是[1

a1a2

a3] ,它的數學大小 =−

8+(a

1∗22

+a2∗

2+a3

) ,設右側為

a ,那麼數學大小 =−

8+a 假設負數b的補碼表示是[1

b1b2

b3] ,它的數學大小 =−

8+(b

1∗22

+b2∗

2+b3

) ,設右側為

b ,那麼數學大小 =−

8+b 那麼「值的位運算不溢位」這個條件用數學表示就是 a+

b<

8 這時候計算數**算結果:−8

+a−8

+b=−

16+a+

b ,因為a+

b<

8 ,所以這個結果一定小於−8

,而它的表示範圍是−8

7 ,所以溢位了

一正一負

正數絕對值大於負數情況不存在

數學結果:正

位運算結果:0和1相加得到1,也就是負

雖然結果不一致,但是可以證明這種情況不存在,也就是「正數絕對值大於負數」時「值的位運算一定溢位」

證明:

假設正數a的補碼表示是[0

a1a2

a3] ,它的數學大小 =a

1∗22

+a2∗

2+a3

=a假設負數b的補碼表示是[1

b1b2

b3] ,它的數學大小 =−

8+(b

1∗22

+b2∗

2+b3

)=−8

+b「正數絕對值大於負數」的數學表示是 a−

8+b>0⇒

a+b>

8 「值的位運算」結果為a+

b ,它一定大於8就說明溢位了

正數絕對值小於負數符號一致

數學結果:負

位運算結果:0和1相加得到1,也就是負

正數絕對值等於負數情況不存在

位運算結果需要是0,而如果值位不溢位,符號一定為負,其實通過「正數絕對值大於負數」這個證明可能看出,正數絕對值等於負數時值位也一定溢位

2)值的位運算溢位

兩個正數情況不存在

兩個正數的值位運算溢位意味著運算結果大於8,意味著數**算結果溢位,不考慮

兩個負數符號一致

數學結果:一定是負的

位運算結果:兩個1相加是0,但是有進製,如果進製為1就沒問題,那進製會不會是2呢?不會,因為後三位最大是7,兩個7是14,不超過16,所以結果也是負數

一正一負

正數絕對值大於等於負數符號一致

數學結果:正

位運算結果:0和1相加得到1,溢位1位得到0,也就是正

正數絕對值小於負數情況不存在

數學結果:負

位運算結果同上,為正

但這種情況不存在,也就是「正數絕對值小於負數」一定不「值的位運算溢位」

證明 假設正數a的補碼表示是[0

a1a2

a3] ,它的數學大小 =a

1∗22

+a2∗

2+a3

=a假設負數b的補碼表示是[1

b1b2

b3] ,它的數學大小 =−

8+(b

1∗22

+b2∗

2+b3

)=−8

+b「正數絕對值小於負數」數學表示是 a−

8+b<0⇒

a+b<

8 ,說明值的位運算一定不溢位

總結以上對於「運算結果的符號表示正確」的證明,所有存在的情況中,符號都是一致的,所以運算結果的符號表示也是正確的。

綜上所述,4個條件均成立,所以從目前來看,補碼的正確性是可以保證的。

見計算機中整數為什麼以「補碼」的形式儲存?

krusal演算法正確性的證明

krusal演算法步驟如下 新建圖g,g中擁有原圖中相同的節點,但沒有邊 將原圖中所有的邊按權值從小到大排序 從權值最小的邊開始,如果這條邊連線的兩個節點於圖g中不在同乙個連通分量中,則新增這條邊到圖g中 重複3,直至圖g中所有的節點都在同乙個連通分量中 為什麼這一定是最小生成樹呢?關鍵還是步驟3中...

kmp優化正確性證明

鄧俊輝老師的課上給出了一種普遍的kmp演算法優化,但是沒有給出這種優化的正確性證明。或許這種正確性是顯而易見的,但這裡還是研究了一下這個演算法的正確性問題。int buildnext char p else 原演算法 j next j 優化演算法 j newnext j return next 顯然...

Dijkstra演算法正確性證明

問題 求圖中點1到其他各點的最短距離 演算法描述 設初始時圖的所有點的集合u 把起點s放入初始集合set中 u u set set 找s經過集合set中的點,能達到的距離最短的點k k in u 將k併入set 言外之意k的前乙個點必然屬於set u u set set 由於每次引入的只有乙個點k,...