基于Visual C++2013拆解世界五百强面试题--题4-double转换成字符串

请用C语言实现将double类型数据转换成字符串,再转换成double类型的数据、int类型的数据

想要完成题目中的功能,首先我们的先对系统存储double的格式有所了解。

浮点数编码转换使用的是IEEE的编码标准。

类型
存储位数
偏置值
数符(S)
阶码(E)
尾数(M)
总位数
十六进制
十进制
短浮点数(Single,float)
1位
8位
23位
32位
7FH
+127
长浮点数(Double)
1位
11位
52位
64位
3FFH
+1023
临时浮点数(扩展精度浮点数)
1位
15位
64位
80位
3FFFH
+16383

如上图可以看到double类型占8字节空间,最高位存储符号位, 

然后接下来11位存储(1023+指数位),剩下的52位存储的科学计数法的位数,

整数部分默认为1,所以被省略了


下面用实例解析一下:

浮点数 -9988777.25  是负数,所以最高位为1

然后将9988777.25转换成二进制 100110000110101010101001.01, 

然后转换成科学计数就是1.0011000011010101010100101 * 2^23,那么指数就是23, 接下来11位是1023+23=1046  

那么剩余的52位存储的尾数是0011000011010101010100101,不足52位在后门补0,多于52位的舍弃

完整的64位存储值应该是这样的:   1   10000010110   0011000011010101010100101 000000000000000000000000000    =  0xC1630D5528000000


下面我们按照国际惯例用vs2013建个工程,里面输入代码,在 double db = -9988777.25处打个断点,

F5调试起来,然后在内存窗口查看变量db, 可以看到如下图   0x002BFBA8  00 00 00 28 55 0d 63 c1


可以看到正好和我们推算的值0xC1630D5528000000相等。



实现代码的时候发现这个花费的时间有点长啊,感觉不对劲,再看看题目发现我跑题了,

题目中说用C语言实现,没有限定我们使用C标准库,那么我们用ecvt这个函数来获取他的符号位和指数,

简单处理一下字符串中的小数点就行了。下面上代码:



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//double 转换成 字符串      double to ascii
char* dtoa(double Val, int NumberOfDigits, int *Dec, int *Sign)
{
	//NumberOfDigits是精度,Dec是指数,Sign表示是否有符号
	char *pdouble = ecvt(Val, NumberOfDigits, Dec, Sign);
	
	//添加小数点到字符串中
	int i = 0;
	for (i = strlen(pdouble); i >= *Dec; i--)
	{
		pdouble[i + 1] = pdouble[i];
	}
	pdouble[i+1] = '.';
	
	//如果是负数添加负号到字符串前面
	if (*Sign)
	{
		for (i = strlen(pdouble); i > 0; i--)
		{
			pdouble[i + 1] = pdouble[i];
		}
		pdouble[0] = '-';
	}
	return pdouble;
}

int main()
{
	int Dec = 0, Sign = 0;
	char *p;
	double db;
	int idb;

	//double类型转换成字符串
	p = dtoa(9988777.25, 10, &Dec, &Sign);

	//字符串转换成double
	db = atof(p);

	//字符串转换成int
	idb = atoi(p);

	printf("%s  %lf   %d\n",p, db, idb);

	return 0;
}

运行效果如下:



如果有什么问题和疑问可以在下面留言互相探讨。

原题我已经上传到这里了http://download.csdn.net/detail/yincheng01/6461073 ,

解压密码为 c.itcast.cn



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值