作者在 2011-10-09 17:17:09 发布以下内容
在学《C程序设计(第4版)》。看到第50页,搞不明白实型数据的数据范围是怎么计算的,想知道实型数在内存里存储的2进制码是什么样的,看到一篇博文http://blog.csdn.net/sandyzhs/article/details/4275765讲到了一点,里面的程序对我来说有点高深看不大懂,自己试着编了一个比较笨的,功能也没完全实现。先记录下来回头慢慢学
/*
时间:2011年10月9日17:04:25
功能:输入一个float型数,输出其在内存中存储的2进制码
备注:输入0时的输出状态不对
*/
# include <stdio.h>
int main()
{
float x;
int i;
int e;
int a[32];
printf("输入浮点数:\n");
scanf("%f",&x);
if (x>=0.0) //符号位表示浮点数的正负
{
a[0]=0;
}
else
{
a[0]=1;
x = -x;
}
if (x<=1.0)
{
for(e=0; e>-128; --e) //规定尾数必须是一个大于1小于2的小数(比如1.25)
{
if(x>=1.0 && x<2.0)
{
break;
}
x *= 2.0;
}
}
else
{
for(e=0; e<128; ++e)
{
if(x>=1.0 && x<2.0)
{
break;
}
x /=2.0;
}
}
x -= 1.0; //这样的话系统默认有一个1,因此只需要存储后面的0.25(1就不需要存储了),0.25用二进制表示是0.01,再去掉(0.)就成为01。
for (i=9; i<32; ++i)
{
x *= 2.0;
if(x>=1.0)
{
a[i]=1;
x -= 1.0;
}
else
{
a[i]=0;
}
}
if(e>0) //如果指数为0,则用01111 1111表示(即10进制的127,在此基础上加或减),比如1用1000 0000表示,-1用0111 1110表示。依此类推。
{
e = e-1;
a[1]=1;
}
else
{
e = e+127;
a[1]=0;
}
for (i=8; i>1; --i)
{
a[i] = e%2;
e = e/2;
}
printf("SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM\n"); //S表示符号位,X表示阶数,M表示尾数
for (i=0; i<32; ++i)
{
printf("%d",a[i]);
if (3==i%4)
{
printf(" ");
}
}
printf("\n");
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入浮点数:
2.0
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0100 0000 0000 0000 0000 0000 0000 0000
Press any key to continue
输入浮点数:
-2.0
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
1100 0000 0000 0000 0000 0000 0000 0000
Press any key to continue
输入浮点数:
1
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0011 1111 1000 0000 0000 0000 0000 0000
Press any key to continue
输入浮点数:
0.75
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0011 1111 0100 0000 0000 0000 0000 0000
Press any key to continue
输入浮点数:
2.5
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0100 0000 0010 0000 0000 0000 0000 0000
Press any key to continue
输入浮点数:
0.1
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0011 1101 1100 1100 1100 1100 1100 1101
Press any key to continue
输入浮点数:
0
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0000 0000 -1000 0000 0000 0000 0000 0000
Press any key to continue
————————————
*/
时间:2011年10月9日17:04:25
功能:输入一个float型数,输出其在内存中存储的2进制码
备注:输入0时的输出状态不对
*/
# include <stdio.h>
int main()
{
float x;
int i;
int e;
int a[32];
printf("输入浮点数:\n");
scanf("%f",&x);
if (x>=0.0) //符号位表示浮点数的正负
{
a[0]=0;
}
else
{
a[0]=1;
x = -x;
}
if (x<=1.0)
{
for(e=0; e>-128; --e) //规定尾数必须是一个大于1小于2的小数(比如1.25)
{
if(x>=1.0 && x<2.0)
{
break;
}
x *= 2.0;
}
}
else
{
for(e=0; e<128; ++e)
{
if(x>=1.0 && x<2.0)
{
break;
}
x /=2.0;
}
}
x -= 1.0; //这样的话系统默认有一个1,因此只需要存储后面的0.25(1就不需要存储了),0.25用二进制表示是0.01,再去掉(0.)就成为01。
for (i=9; i<32; ++i)
{
x *= 2.0;
if(x>=1.0)
{
a[i]=1;
x -= 1.0;
}
else
{
a[i]=0;
}
}
if(e>0) //如果指数为0,则用01111 1111表示(即10进制的127,在此基础上加或减),比如1用1000 0000表示,-1用0111 1110表示。依此类推。
{
e = e-1;
a[1]=1;
}
else
{
e = e+127;
a[1]=0;
}
for (i=8; i>1; --i)
{
a[i] = e%2;
e = e/2;
}
printf("SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM\n"); //S表示符号位,X表示阶数,M表示尾数
for (i=0; i<32; ++i)
{
printf("%d",a[i]);
if (3==i%4)
{
printf(" ");
}
}
printf("\n");
return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入浮点数:
2.0
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0100 0000 0000 0000 0000 0000 0000 0000
Press any key to continue
输入浮点数:
-2.0
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
1100 0000 0000 0000 0000 0000 0000 0000
Press any key to continue
输入浮点数:
1
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0011 1111 1000 0000 0000 0000 0000 0000
Press any key to continue
输入浮点数:
0.75
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0011 1111 0100 0000 0000 0000 0000 0000
Press any key to continue
输入浮点数:
2.5
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0100 0000 0010 0000 0000 0000 0000 0000
Press any key to continue
输入浮点数:
0.1
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0011 1101 1100 1100 1100 1100 1100 1101
Press any key to continue
输入浮点数:
0
SXXX XXXX XMMM MMMM MMMM MMMM MMMM MMMM
0000 0000 -1000 0000 0000 0000 0000 0000
Press any key to continue
————————————
*/