C51中的浮点数采用IEEE-754标准来表示,存储长度为4个字节,其中包含3个位域:数符,阶码和尾数。
(1)1位数符位:D31
(2)8位阶码:D30----D23(补码形式存放),其中D30是符号位,与一般表示方法不同,它用1表示正,用0表示负。
(3)23位尾数:D22----D0(原码形式存放)(注意第一位尾数不出现在内存中,它总是1,故省略了。)
将一个实数存数在C中的方式为:
(1)将这个实数的绝对值转化成二进制格式。(整数部分:除二取余,逆序排列;小数部分:乘2取整,顺序排列。)
(2)将这个二进制格式实数的小数点,左移或右移n位,直到整数部分有且只有一位有效数字(即整数部分必须为一个1)。
(3)从小数点左边第一个二进制数字开始,取23位数字放入D22-----D0位(尾数部分)。
(4)如果该实数为整数,则在D31(数符位)位写入1,负数写入0。
(5)如果n是左移得到的,则说明指数是正,则在D30位写入1;如果n是右移得到的或n=0,则D30位放入0。
(6)如果n是左移得到的,则将(n-1)后转化成二进制,并在左边补0得到7位二进制数,放入D29----D23中。如果n是右移得到或n=0,则将你转化成二进制后在左边补0得到7位二进制数,然后依次各位取反,对应写入D29-----D23位。
01000001101111000111101011100001
D31D30D29D28D27D26D25D24D23D22D21D20D19D18D17D16D15D14D13D12D11D10D9D8D7D6D5D4D3D2D1D0
下面,将23.56化为C语言的float格式存储,讲述浮点数的存数方式:
(1)按“整数部分:除二取余,逆序排列”,“小数部分:乘2取整,顺序排列”将23.56转化成二进制实数约为:10111 . 1000,1111,0101,1100,001(因为要左移4位,所以小数点后保留23-4位数字即可)(若为负数,则此步骤位求其绝对值的二进制实数表达形式)
(2)将小数点左移4位(n=4),得到1 . 0111,1000,1111,0101,1100,001
(3)这时已经有24位位数了,将最高位的1舍去,将剩下的23位小数部分数字对应写入尾数的D22---D0位。
(4)由于23.56是正数,所以在D31(数符位)写入0。
(5)因为我们把小数点左移,因此在D30位放入1(指数为正数)。
(6)因为我们把小数点左移n=4位,所以(n-1)=3,化为二进制,补足7位为:000,0011。写入D29---D23位。