按照IEEE754标准,浮点数的格式为,从最高位开始一次是:
数符S,阶码E,尾数M;数符是指这个数是正的,还是负的;
在计算机中一个任意进制数N可以写成:N=R的e次方 乘以m;R就是基数(在电脑中基数当然是2),e就是
阶码,m就是尾数
32为浮点数中,
S是浮点数的符号位,占一位,安排在最高位,S=0表示正数,S=1表示负数;
E是阶码,占用8位,阶符采用隐含方式,即采用移码来表示正负指数,采用这种方式时,将浮点数的指数
真值e变成阶码E时,应将指数e加上一个固定的偏移值127(01111111),即E=e+127;
M是尾数,占用23位,用小数表示,小数点放在尾数域的最前面,其实小数点前面还有一位1,只不过这个
1是不用写出来的,例如1.101001的尾数是101001,即M=101001,而小数点前面的1是规定不写的,这样做
只是为了扩大数的范围
例如32位的浮点数18.75 的二进制形式是:10010.11,
用IEEE754标准表示方法如下,
把小数点移动e位,使小数点左边只有一位有效数字1,这样e就是这个数的阶码的真值;对于这个数,把
小数点向左移4位,变成了1.001011,e=4,即真值阶码为4,则阶码E=e+127,用二进制表示为10000011,
E=10000011就是18.75这个数的阶码。这个数为正,因此数符位为0,18.75在计算机内的表示为
0 10000011 0010110 00000000 00000000
这样-18.75在计算中的表示为 1 10000011 0010110 00000000 00000000
下边这个程序在TC2.0下编译通过,作用是用二进制的形式输出一个浮点数在计算机的表示形式,在计算
机中高字节占据高地址,这里我取float f=-18.75输出的结果是1 10000011 0010110 00000000 00000000
你可以把它改为18.75输出看看结果
#include<stdio.h>
void outBinary(unsigned char ch);
int main(void)
{
float f=-18.75;
unsigned char *p,ch;
int i;
p=(unsigned char *)(&f);
clrscr();
i=sizeof(f);
printf("/nsizeof(float)= %d/n/n",i);
for(i=sizeof(f)-1;i>=0;i--)
{
ch=*(p+i);
outBinary(ch);
putchar(' ');
}
return 0;
}
void outBinary(unsigned char ch)
{
int i;
for(i=0;i<8;i++)
{
if( (ch<<i) & 0x80) putchar('1');
else putchar('0');
}
}
对于64位浮点数(double)也是一样,只不过阶符用12位表示,其他的都一样