(4)使用浮点数格式举例
按IEEE标准,常用的浮点数的格式为:
下面以32位浮点数(短实数)为例,讨论浮点代码与其真值之间的关系,其浮点格式如下
最高位是数符s,其后8位阶码,以2为底,阶码偏置位127。其余23位是尾数,为了尾数部分能表示更多一位的有效值,IEEE754采用隐含尾数最搞数位1(即这一位1不表示出来)的方法,因此尾数实际上是24位。应注意隐含的1是一位整数(即位权位2^0),在浮点格式中表示出来的23位尾数是纯小数并用原码表示,尾数的真值为:1+尾数。这样,上述格式的非0浮点数真值为
(-1)x2^(阶码-127)x(1+尾数)
根据上式,可得出上述格式的浮点数表示范围位-2^128x(2-2^(-23))~2^128x(2-2^(-23)),所能表示的最小绝对值位2^(-127).
例:
若采用IEEE短实数格式,试求出32位浮点数代码(CC968000)16的真值。
解:以上代码转换位2进制如下:
                          1,10011001,00101101000000000000000
                                阶码          尾数
由于数符是1,所以该数是负数。
阶码真值=10011001-(127)10=(153)10-(127)10=(26)10
尾数真值=1+0.00101101=1+(0.00101101)2=1+(0.17578125)10=(1.17578125)10
故该浮点数的真值=-2x1.17578125 。
例:
试将-(0.11)2用IEEE短实数浮点数格式表示出来。
解:(-0.11)2=-0.11x2^0
            =-1.1x2^(-1)
            =-(1+0.1)x2^(-1)
该数为负数,所以数符为1.
阶码=阶码真值+127=-1+127=126=(01111110)2
尾数=0.1000……0
所以浮点数代码为1,01111110,10000000000000000000000
注意:IEEE标准尾数采用的是原码
现在来看一个10进制转换为16进制以IEEE为标准:
float
共计32位,折合4字节
由最高到最低位分别是第31、30、29、……、0位
31位是符号位,1表示该数为负,0反之。小数的原码
30-23位,一共8位是指数位。
22-0位,一共23位是尾数位。
每8位分为一组,分成4组,分别是A组、B组、C组、D组。
每一组是一个字节,在内存中逆序存储,即:DCBA
    一步步的将float型浮点数12345.0f转换为十六进制代码。在处理这种不带小数的浮点数时,直接将整数部转化为二进制表示:1 11100010 01000000也可以这样表示:11110001001000000.0然后将小数点向左移,一直移到离最高位只有1位,就是最高位的1:1.11100010010000000一共移动了16位,在布耳运算中小数点每向左移一位就等于在以2为底的科学计算法表示中指数+1,所以原数就等于这样:1.11100010010000000 * ( 2 ^ 16 )好了,现在我们要的尾数和指数都出来了。显而易见,最高位永远是1,因为你不可能把买了16个鸡蛋说成是买了0016个鸡蛋吧!所以这个1我们还有必要保留他吗?好的,我们删掉他。这样尾数的二进制就变成了:11100010010000000最后在尾数的后面补0,一直到补够23位:11100010010000000000000 再回来看指数,一共8位,可以表示范围是0 - 255的无符号整数,也可以表示-128 - 127的有符号整数。但因为指数是可以为负的,所以为了统一把十进制的整数化为二进制时都先加上127,在这里,我们的16加上127后就变成了143,二进制表示为:1000111112345.0f这个数是正的,所以符号位是0,那么我们按照前面讲的格式把它拼起来:
0 10001111 11100010010000000000000
01000111 11110001 00100000 00000000
再转化为16进制为:47 F1 20 00,最后把它翻过来,就成了:00 20 F1 47。(因为在内存中的存储是倒序的)
现在你自己把54321.0f转为二进制表示,自己动手练一下!