補碼的形成與本質

2021-06-06 14:22:25 字數 1529 閱讀 5656

補碼,正數原補碼相同,負數是把正數的原碼取反再+1。

乙個簡單的補碼計算技巧是:要把乙個負數用其補碼寫出來,首先把其對應的正數從右向左找到第乙個1,這個1和以及它右邊的那些0都不動,把這個1左邊的全部數字取反,就得到對應的補碼表示。

簡單解釋一下這種演算法的原理:本質上講,補碼就是為負數而生的。計算機裡沒有負數的概念,所以把負數寫成補碼這種樣子,通過最高位被進製實現正確的運算。

因為涉及最高位進製,所以尾部必然要多出來乙個1用來實現相加進製。因此關鍵是從右向左找到最後乙個1,最後乙個1及之後的內容不變,之前內容全部取反。

示例:-9的補碼表示方法:

00001001 (+9)

從右向左找到最後乙個1及之後的內容不變,之前內容全部取反:

11110111(-9)

同理,想看清補碼形式的負數值,需要做逆變換:

從右向左找到最後乙個1及之後的內容不變,之前內容全部取反:

00001001(+9)

-16的補碼表示:

00010000(+16)

從右向左找到最後乙個1及之後的內容不變,之前內容全部取反:

11110000(-16)

同理,想看清補碼形式的負數值,需要做逆變換:

從右向左找到最後乙個1及之後的內容不變,之前內容全部取反:

00010000(+16)

補碼的發明,使cpu處理任何加減法運算都可以按加法進行,一步完成,不需要事先進行額外的符號位判斷。所以在cpu的設計中只有alu,而沒有減法單元。

這就又涉及到乙個有趣的現象,即補碼運算的溢位。補碼運算之所以會出現溢位,是因為表達位數受到限制:加超了,或者減超了。例如16位有符號數,可以表示的範圍是+32767~-32768,那麼如果讓+32767再加上+32767,或者讓-32768再減去+32767(也即(-32768)+(-32767)),結果肯定都是無法表示出來的,因為總數範圍就在那裡擺著呢。正常的減法操作是不會溢位的,從常識上即可判斷,越減越少,不會出現「無法用言語表達」的尷尬。

通常的cpu設計中都有專門的溢位判斷標誌位(of),不需要程式設計師去計算,只需讀該狀態位即可。但是原理還是要掌握的,cpu到底是靠什麼判斷計算溢位的呢?靠記錄兩個標誌位:cs和cp。其中cs是符號進製記錄,cp是向符號位進製的記錄。還以16位數舉例,如果兩個正數補碼相加,結果大於+32767,超出了表達範圍,只能佔據符號位,此時符號位被進製為1(發生了符號反轉!),所以cp一定有進製,被置為1,而cs無進製,被置為0,結果cs:cp=0:1,發生了正溢位,cpu邏輯單元據此將of=1,判斷發生溢位。如果乙個負數減去乙個正數,就相當於兩個負數相加,此時符號位相加肯定要發生進製,本身清為0,如果結果小於-32768,超出了表達範圍,符號位不會被後面的數值相加進製(此為補碼的數字邏輯原理,如果數值有進製發生就不會超出表達範圍了,負數補碼中符號位後面數字越大,表示的負數值越小,例如-1為0xffff,-32768為0x8000)

,所以cs一定會發生進製,被置為1,而cp一定無進製發生,被置為0,結果cs:cp=1:0,

發生了負溢位,cpu邏輯單元據此將of=1,判斷發生溢位。

補碼的發明,就是為了適應機器的運算模式,減輕機器的勞動強度。

網頁的形成與構造

網頁,由文字 影象 超連結等元素組成的 由 的方式形成,前端的心酸 客戶眼中的美觀。二 瀏覽器的核心 渲染引擎和js引擎 ie用的trident核心,ie衍生edge,火狐瀏覽器用的gecko核心,safarl用的 webkit核心,谷歌和 歐鵬 opera 用的bink核心渲染引擎 移動端的瀏覽器...

原碼與補碼

為了方便,本文假設系統為4位系統。原碼即我們熟知的十進位制轉二進位制,不過最高位為符號位,1代表負數。如2的原始碼是0010,2的原碼是1010,負數的原碼不能直接計算,比如2 2應該為0,但按照原始碼的二進位制計算為1100 4 因此計算時需要一種新的表示方法,那就是補碼。4位的二進位制,最大的數...

勞動差別與價值形成

馬克思在 資本論 中指出商品價值是凝結在商品中的無差別的人類勞動,具體由生產該商品所需的社會必要勞動時間決定,而社會必要勞動時間是在現有的社會正常的生產條件下,在社會平均的勞動熟練程度和勞動強度下製造某種使用價值所需要的勞動時間。這一結論包含著很多資訊,其中兩點很重要 一 人類勞動須是 無差別 的 ...