搜索
写经验 领红包
 > 职场

单片机中数的表示及运算

单片机中的数是以二进制表示的,分为有符号数和无符号数两种。

有符号数的表示方法

有符号数是指有“ + (正)”、“ − (负)”符号的数。由于单片机采用二进制数,所以只有“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的有符号数。若想确切知道单片机中的二进制数所对应的十进制数是多少,先要了解该二进制数是有符号数还是无符号数,再换算出该二进制数对应的十进制数。