單片機中的數是以二進制表示的,分為有符號數和無符號數兩種。
有符號數的表示方法
有符號數是指有“ (正)”、“ ? (負)”符號的數。由于單片機采用二進制數,所以只有“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的有符號數。若想確切知道單片機中的二進制數所對應的十進制數是多少,先要了解該二進制數是有符號數還是無符號數,再換算出該二進制數對應的十進制數。