數值有正負之分,計算機就用乙個數的最高位存放符號(0為正,1為負).這就是機器數的原碼了.假設機器能處理的位數為8.即字長為1byte,原碼能表示數值的範圍為
(-127~-0 +0~127)共256個.
有了數值的表示方法就可以對數進行算術運算.但是很快就發現用帶符號位的原碼進行乘除運算時結果正確,而在加減運算的時候就出現了問題,如下: 假設字長為8bits
( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10
(00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 顯然不正確.
因為在兩個整數的加法運算中是沒有問題的,於是就發現問題出現在帶符號位的負數身上,對除符號位外的其餘各位逐位取反就產生了反碼.反碼的取值空間和原碼相同且一一對應. 下面是反碼的減法運算:
( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10
(00000001) 反+ (11111110)反 = (11111111)反 = ( -0 ) 有問題.
( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10
(00000001) 反+ (11111101)反 = (11111110)反 = ( -1 ) 正確
問題出現在(+0)和(-0)上,在人們的計算概念中零是沒有正負之分的.(印度人首先將零作為標記並放入運算之中,包含有零號的印度數學和十進位制計數對人類文明的貢獻極大).
於是就引入了補碼概念. 負數的補碼就是對反碼加一,而正數不變,正數的原碼反碼補碼是一樣的.在補碼中用(-128)代替了(-0),所以補碼的表示範圍為:
(-128~0~127)共256個.
注意:(-128)沒有相對應的原碼和反碼, (-128) = (10000000) 補碼的加減運算如下:
( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10
(00000001)補 + (11111111)補 = (00000000)補 = ( 0 ) 正確
( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10
(00000001) 補+ (11111110) 補= (11111111)補 = ( -1 ) 正確
所以補碼的設計目的是:
⑴使符號位能與有效值部分一起參加運算,從而簡化運算規則.
⑵使減法運算轉換為加法運算,進一步簡化計算機中運算器的線路設計
所有這些轉換都是在計算機的最底層進行的,而在我們使用的彙編、c等其他高階語言中使用的都是原碼。看了上面這些大家應該對原碼、反碼、補碼有了新的認識了吧!
關於原碼 補碼 反碼的理解
補下基礎 原碼 補碼 反碼 正數補碼 反碼都和原碼一樣,符號位為0 負數原碼 符號位為1,其他位為 絕對值表示的二進位制數 反碼 原碼符號位不變 其他位按位取反 補碼 反碼 1 反碼的問題是 00000000 為0,反碼為 00000000 10000000 也為0,反碼為 11111111 這樣0...
這些程式設計細節,你知道嗎?(C 篇)
那些你容易忽略的事兒,總是讓你掉在坑里很久很久,謹以此文章避免那些 黑洞。class class1 public class1 class1 o1 new class1 class1 o2 new class1 console.writeline class1.count 問題描述 請問上面的 最後...
關於軟體文件 這些你知道嗎?
軟體文件 document 也稱檔案,通常指的是一些記錄的資料和資料 它具有固定不變的形式,可被人和計算機閱讀。它和 電腦程式共同構成了能完成特定功能的計算機軟體 有人把源程式也當作文件的一部分 我們知道,硬體產品和產品資料在整 個生產過程中都是有形可見的,軟體生產則有很大不同,文件本身就是軟體產品...