補碼的回顧以及補碼發明的思路推演思考

2021-06-25 23:50:20 字數 1444 閱讀 6697

n個二進位制位,m=n-1

通過一種編碼對映。100...00 - 111...11 表示 (-2^m) - (-1) ; 000...00 - 011...11 表示 (0) - (2^m - 1)

對於編碼a的求補 f(a) = (2^n)- a

對於正數和零,原碼即是補碼

對於負數a,一般理解方法:

先做反碼,然後編碼意義上加1

換言之,若要對乙個數a求反,對那個數的補碼a1做一次求補運算f(a1),所求的補碼b1就是原來數a的相反數b的補碼。

這裡提供

原碼轉化成補碼

另外乙個理解方法

對於求負數a的補碼

本質上,負數a的相反數b,b是正數,b的原碼b1就是b的補碼,a的補碼就是f(b1)

---x-y = x-1-y+1 = (x-1) - y + 1

在補碼的轉碼中,這裡的x=2^n 

這裡的(x-1) - y即使對y進行反碼操作,在alu中可以n位同時重新整理

至於n位整數+1,有一定的進製延時。

---邊界情況:

容易看到,我們對-2^n求反,仍然是-2^n

對2^n-1求反,則是-(2^n)-1

---利用補碼這種編碼性質

f(y) = -y

x + y = x + y

x - y = x + f(y)

---

先看正碼表示,設n=4, -1 = 1001; -2 = 1010, -1 > -2, 但是 1001 < 1010,兩種對映的編碼的序性不一致

反碼呢,-1=1110, -2 = 1101,  ok,序性正確了,

然而,這裡有乙個問題,就是正數與負數之間,有乙個1的縫隙。-1=1110, 1=0001,從迴圈編碼的角度,這兩個編碼相差3:1110->1111->0000->0001。

因為正零和負零是兩個數,導致兩個數系的斷裂。怎麼辦?讓負數整體往正數靠攏,邁進一步(+1),負1沒有了。

這就是求補的過程了。反碼再加1。

我想,當初寫出計算機的編碼設計**的大牛(好像是圖靈還是什麼的),當然有更深的考慮。但從序性和數系聯絡的角度,補碼的發明是相當合理的。而這種合理性,我個人認為,正是其優點。

從機器實現的角度,並不算複雜,但相對反碼的機器實現,還是多了+1的進製延時。

---int與unsigned int的思考

順便,我也整理一下這裡的誤區。

如果宣告變數a為int,但是卻當作unsigned int,如果正常累加超出範圍,轉化成unsigned int結果應該還是可信的。

不過算了,我們利用好轉換和保證型別的一致,這些底層的問題我們確實還是當作透明為好。

---歡迎**。

regards,

junhao li

[email protected]

---

from

1的補碼及2的補碼

一 計算機的負數表示 二 1的補碼one s complement 反碼 三 2的補碼two s complement 補碼 資料在計算機中由乙個乙個的0,1位元表示,所以在表示負數的時候,不能直接新增符號 來表示這是個負數,必須採用一些規範或者約定來區分正數和負數。有四種比較有名的表示負數的方法 ...

128的補碼及原碼 反碼 補碼

乙個位元組佔8位 乙個字長為n的機器數能表示不同的數字的個數是固定的2 n個,n 8時2 n 256 用來表示有符號數,數的範圍就是 2 n 1 2 n 1 1,n 8時,這個範圍就是 128 127。用來表示無符號數,就不需要用一位來表示符號位,n位機器數全部用來表示是數值,這時表示數的範圍就是0...

原碼 反碼 補碼和 2147483648的補碼表示

在網上看到乙個挺奇怪的說法 乙個整數的原碼是這個數的絕對值的原碼,然後他就得出了 00000000 00000000 00000000 00000101 是 5的 原碼 然後他又說反碼就是32位的每一位都取反 比如 將00000000 00000000 00000000 00000101每一位取反,...