單片機中數的表示及運算

單片機中的數是以二進制表示的,分為有符號數和無符號數兩種。

有符號數的表示方法

有符號數是指有“ + (正)”、“ − (負)”符號的數。由於單片機採用二進制數,所以只有“1 ”和“0”兩種數字,其中用“ 0 ”表示“ + ”,用“ 1 ”表示“ − ” 。單片機中的數據一般只有8位,一般規定最高位為符號位,因為要用1位表示數的符號,所以只有7位用來表示數值,可以表示− 127~+128。

有符號數的表示方法有 3 種:原碼、反碼和補碼。同一有符號數,用 3 種表示方法得到的數是不同的。下面用3種方法來表示兩個有符號數+1011101和− 1011101。

(1)原碼

用“1”表示“−”,用“0”表示“+”,其他各數保持不變,採用這種方法表示出來的數稱為原碼。

+1011101用原碼錶示是01011101,可寫成[01011101] 原。

− 1011101用原碼錶示是11011101,可寫成[11011101] 原。

(2)反碼

反碼是在原碼的基礎上求得的。對於正的有符號數,其反碼與原碼相同;對於負的有符號數,其反碼除符號位與原碼相同外,其他各位數由原碼各位數取反得到。

+1011101用反碼錶示是01011101,可寫成[01011101] 反。

− 1011101用反碼錶示是10100010,可寫成[10100010] 反。

(3)補碼

補碼是在反碼的基礎上求得的。對於正的有符號數,其補碼與反碼、原碼相同;對於負的有符號數,其補碼除符號位與反碼一致外,其他數由反碼加1得到。

+1011101用補碼錶示是01011101,可寫成[01011101] 補。

− 1011101用補碼錶示是10100011,可寫成[10100011] 補。

有符號數的運算

用原碼錶示有符號數簡單、直觀,但在單片機中,如果採用原碼進行減法運算,需要很複雜的硬件電路;如果用補碼,可以將減法運算變為加法運算,從而省去減法器而簡化硬件電路。

例如:用二進制減法運算和補碼加法運算分別計算35 − 21。

① 二進制減法運算:35 − 21=00100011 − 00010101=00001110

② 用補碼加法運算。

先將算式轉換成補碼形式,35 − 21=[+35]+[ − 21]= [00100011] 原 +[10010101] 原 =[00100011] 反+ [11101010] 反 =[00100011] 補 +[11101011] 補。

再對補碼進行二進制加法運算:

單片機中數的表示及運算

從上面的運算過程可以看出,補碼的符號也參與運算,在8位單片機中,由於數據長度只能有8位,上式結果有9位,第9位會自然丟失,補碼加法的運算結果與二進制減法的運算結果是一樣的,都是00001110=14。

由此可見,用補碼的形式進行運算,可以將減法運算轉換為加法運算,運算結果仍是正確的,所以單片機普遍採用補碼的形式表示有符號數。

無符號數的表示方法

無符號數因為不用符號位, 8 位全部用來表示數據,所以這種方法可以表示的數據範圍是 0 ~ 255 。 8位二進制數的不同表示方式的換算關係見表1-6。

表1-6 8位二進制數的不同表示方式的換算關係

單片機中數的表示及運算

表1-6

續表

單片機中數的表示及運算

表1-6

從表1-6中可以看出,對於同一個二進制數,當採用不同的表示方式時,得到的數值是不同的,特別是大於10000000的有符號數。若想確切知道單片機中的二進制數所對應的十進制數是多少,先要了解該二進制數是有符號數還是無符號數,再換算出該二進制數對應的十進制數。


分享到:


相關文章: