参考资料:
1、http://www.
2、《狂人C—程序员入门必备》(键盘农夫【著】)
对于5.01的double型存储,先转换成二进制指数形式,0101.……(这里是0.01的二进制)=1.01……(这里是0.01的二进制)(我懒了,没写上去)x2²,因此指数部分是2
至于52位尾数,可以利用乘2取整,这个不做过多说明
第一位是符号位,也不多说明
对于指数,double型和float型有区别,float型,8位指数位,要加127,对于double型,11位指数位,要加1023,才是最后存储的值
所以
5.01,指数为2,即 000 0000 0010,加上1023(011 1111 1111)得出100 0000 0001,因此29楼正解……
至于验算,在参考资料2的书中,介绍了一种利用共用体查看的方法,
代码如下:
#include<stdio.h>
int main()
{
void output(unsigned char[],int);
union double_char
{
double d;
unsigned char byte[8];
}u;
u.d=5.01;
output(u.byte,sizeof(u.byte)/sizeof(u.byte[0]));
return(0);
}
void output(unsigned char byte[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%02X ",byte[i]);
}
printf("\n");
}
要说明的是,计算机输出是从右向左方向输出,因此输出的8个两位十六进制数要翻转一下顺序,才是实际的存储方式的体现
如本例中,输出
0A D7 A3 70 3D 0A 14 40
实际是40 14 0A 3D 70 A3 D7 0A
因此是01000000 00010100 00001010 00111101 01110000 10100011 11010111 00001010
[
本帖最后由 S_Ringo 于 2012-4-26 15:45 编辑 ]