說說補碼

  所有的數學原理,背後都是最簡單最自然的思維和道理而已!首先我們知道一個數在計算機裏是用其補碼形式表示、參與計算的,這個補碼就是所謂機器數。補碼被設計出來就爲了 CPU 可以把減法當加法算。而把減法當成加法算,原理和我們算法裏學的“減一個數等於加上這個數的負數”是類似的,計算機裏把減法當成加法算的原理近似來說是“減一個數等於加上這個數的補,然後取餘”。
  具體實現的時候,巧妙的使用了符號位,對於大數減小數,可以理解爲加上減數的補,小數的補比較大,並溢出,餘下的就是結果。對於小數減大數,大數補比較小,相加之後並未溢出,符號位爲 1 成爲負數,1 ~ 7 位 是結果的補(以 m 爲 10 舉例,2 - 3 = 2 + 7 = 9),加上符號位,正是結果的補碼形式。在運算的時候,取反並加一是求補,取餘是通過符號位參與運算必要時產生溢出實現的。
  以 byte 爲例,第一位是符號位,m 是 2^7 = 128,[0, 127]。如果我們計算 a - b,b 的補就是 2^7 - b。再來看看補碼,如果我們把 b 的補碼認爲是 d,d 是 b 的取反並加一,這個時候如果我們把 d 和 b 的 1 ~ 7 位都看成無符號的正數,b + d = 2^7(1 ~ 7 位因爲互爲反,加了之後全爲 1,最後再加一,全部進位,得到 2^7),所以看 1 ~ 7 位, d = 2^7 - b。符號位標識正反,讓符號位參與運算,爲了方便的使用溢出來實現取餘。-128 的補碼是 10000000,是個特殊存在,是個沒有原碼的合法補碼(原碼理論是 100000000,不是不存在,只是沒法用 byte 表示,剛好補碼用 byte 表示的了,所以這個數就成了沒有原碼錶示,只有補碼錶示的特殊的數了)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章