真值,原碼,反碼,補碼和移碼 釋義

來源:互聯網
上載者:User
簡單定義
  • 真值:

正數或負數的真值為其絕對值對應的位元前面加上正號或負號。

比如: 2的真值為+00000010
      -2的真值為-00000010
(其中正號可以省略)

  • 原碼:(原碼的第一位表示符號位,0表示正,1表示負)

正數的原碼為對應的位元,  如2的原碼為00000010

負數的原碼為其絕對值對應的位元的第一位變為1,如-2的原碼為10000010

  • 反碼:

正數的反碼與其原碼相同

負數的反碼是對其原碼逐位取反,符號位除外。

  • 補碼:

正數的補碼與原碼相同

負數的補碼是在其反碼的末位加1

  • 移碼:

移碼是對補碼的符號位取反得到的

以8位位元為例:
                     2             -2
真值 00000010    -00000010
原碼 00000010    10000010
反碼 00000010    11111101
補碼 00000010    11111110
移碼 10000010    01111110

為什麼要使用原碼,反碼,補碼 ?
  • 原碼:

日常生活中,我們使用十進位來表示一個數, 如果是負數的話,我們就在數的前面加一個符號( “-”)。

但是在電腦中,只能識別0 和 1。(類似脈衝的變化.....).

這樣的話,就需要使用二進位的方式來表示數。

對於負號的識別方面,用一個位元的最高為存放符號(0為正, 1為負), 這樣就產生了機器數的原碼了。

  • 反碼:

在使用原碼進行計算時, 比如:

十進位  (1) 10 - (1)10 = (1)10 + (-1)10 = (0)10

二進位  (0 0000001)原 + (1 0000001)原 = (1 0000010)原 = ( -2 )

很顯然,這個結果是錯誤的。這樣得到一個結論,涉及到負數的加法時,使用原碼進行加減是有問題的。

於是乎, 嘗試使用反碼進行運算:

(0 0000001)反 + (1 1111110)反 = (1 1111111)反 =  (1 0000000)原 = ( -0 )

看上去接近了, 但還是有問題,結果應該是(+0)

(+0)和(-0)上,在人們的計算概念中零是沒有正負之分的。於是就引入了補碼的概念

  • 補碼

負數的補碼就是對反碼加一,而正數的補碼不變,正數的原碼反碼補碼是一樣的。在補碼中用(-128)代替了(-0),這個是人為規定的,所以補碼的表示範圍為:

(-128~0~127)共256個。

(0 0000001)補 + (1 1111111)補 = (0 0000000)補 = ( 0 )

這下正確了。

所以補碼的設計目的是:

⑴ 使符號位能與有效值部分一起參加運算,從而簡化運算規則。補碼機器數中的符號位,並不是強加上去的,是資料本身的自然組成部分,可以正常地參與運算。

⑵ 使減法運算轉換為加法運算,進一步簡化電腦中運算器的線路設計。

所有這些轉換都是在電腦的最底層進行的,而在我們使用的彙編、c等其他進階語言中使用的都是原碼。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.