C语言中需要用到小数的时候就要引入存小数的变量,小数在C语言中叫浮点数,按精度来划分,类型有两种:
单精度浮点数float、双精度浮点数double
不同的编译环境这两种类型可能占用的字节数有所不同,在VC中float类型占用4个自己,double占用8个字节
在Keil当中float类型也是4个字节,但double这个字节也只有4个字节(实际上和float没有任何区别,精度范围都一样,连内部表示方法都一模一样,至于为什么要在Keil中搞出2个一样的东西,原因是double毕竟是标准C语言中的一种数据类型,所以编译的时候不能不支持,用这个类型符合定义的变量不能报错,但是51单片机毕竟存变量的RAM很小,如果动不动8个字节伤不起,所以采用4个字节)。具体测试方法请参照C语言深入探(二)。
下面重点讨论float通过4个字节怎么表示出小数:
例子一:
32位(0-31):最左边位(第33位)为符号位,0表示正,1表示负数
第32-24位为指数位,共1个字节(8位)值为A,用来表示指数,2^(A-127)
最右边的23位数(第0-22位)比较特殊,从左往右边算值为B,作为小数部分1.0+2^-B
所以公式是(-1)^s * (1.0+2^-B) * 2^(A-127)
这么说可能理解还不具体,下面两个例子:
1 01111111 10000000000000000000000 刚好3部分
最左边1表示为负数,s=1;01111111表示指数是A=127
10000000000000000000000,从左往右边算所以是B=1
代入公式:(-1)^1 * (1.0+2^-1) * 2^(127-127)=-1.5
例子二:
1 10000001 01000000000000000000000
如果是float的码,又是多少?
s=1
A=129
B=2^1=2
代入公式:
:(-1)^1 * (1.0+2^-2) * 2^(129-127)=-5
验证代码:
上面的代码是在Keil软件中测试的,如果是在VC中会怎样呢?因为VC中是小端模式(不明白请看以前的章节)
所以-5的4个字节顺序不再是C0 A0 00 00 而是 00 00 A0 C0
-1.5的4个字节顺序不再是BF C0 00 00 而是 00 00 C0 BF