单片机C语言编程实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 数据的存放形式

计算机处理的数据一般需用存储器保存,存储器以8位为单位,称为一个字节。

2.2.1 整型数据的存放形式

bit类型的数据用单个位存储,一个字节可存放8个bit类型的数据,MCS51系列单片机通常在bRAM中保存bit类型的数据,因为该区间可方便地进行位操作。

char、unsigned char类型的数据保存在一个字节中(8位),以二进制形式存放,如果是负数,则以该数的绝对值取反再加1 的形式存放,这种方式称为该数据的补码。如数据123、-99的存放形式见表2-2:123=01111011B,-99的绝对值为99,99=01100011B,取反后为10011100,最后加1为10011101。

表2-2 char、unsigned char型数据存放形式

int、unsigned int类型的数据用两个字节保存,高字节先保存,低字节后保存,如果为负数,转化为补码进行保存。例如,一个0x1234的整型数在存储区保存方式见表2-3。

表2-3 int、unsigned int型数据存放形式

long、unsigned long类型的数据用四个字节保存,高字节先保存,低字节后保存,如果为负数,转化为补码进行保存。例如,long型数据0x12345678在存储区保存方式见表2-4。

表2-4 long、unsigned long型数据存放形式

2.2.2 实型数据的存放形式

float类型数据常称为浮点数,用四个字节保存,格式一般用下面的IEEE-754标准,它由两个部分组成:尾数和2的幂,即±尾数×2幂。

2的幂代表指数,指数的实际值是保存值(0~255)减去127,范围在127到-128之间。尾数由24位二进制数表示(大约7个十进制数),最高位是1,因此不保存;另外用1位二进制数表示float类型数据的正负号,其保存的字节格式见表2-5。

表2-5 float型数据存放形式

S——符号位,1是负,0是正。E——幂,偏移127。M——24位尾数(保存在23位中)。

例如:浮点数-1027.513作为一个十六进制数0xC480706A保存在存储区中,见表2-3。浮点数和十六进制等效保存值之间的转换相当简单,下面以表2-6为例说明它们是如何转换的。

表2-6 浮点数-1027.513的存放形式

① 符号位是1,表示一个负数。

② 幂是二进制10001001或十进制137,137减去127是10,就是实际的幂。

③ 尾数是后面的二进制数00000000111000001101010。在尾数的左边有一个省略的二进制点和1,保存时被省略,恢复后的尾数值为1.00000000111000001101010。

接着根据指数调整尾数,负的指数向左移动小数点,正的指数向右移动小数点,因为指数是10,小数点右移10 位,尾数调整为10000000011.1000001101010。它是一个二进制浮点数,其整数部分为

1×210+1×21+1×20=1207

其小数部分为

1×2-1+1×2-7+1×2-8+1×2-10+1×2-12=0.512939453125

其误差为0.000060546875。

除了正常的浮点值,还用一些特殊的十六进制数表示浮点运算的过程中出现的错误,其方法见表2-7。

表2-7 特殊十六进制数及其意义