我尝试了两种方法来转换我的char*
类型ss
到双重类型。
这是我的代码(在VC ++ 6.0 windows64位编译)
int main()
{
char *ss = "-1964734.544";
cout<<ss<<endl;
cout<<*reinterpret_cast<double*>(ss)<<endl;
cout<<*(double *)ss<<endl;
}
结果是:
-1964734.544
3.06123e-057
3.06123e-057
我不清楚有什么问题,以及如何将char*
转换为双倍。
答案 0 :(得分:3)
您可以像这样使用strtod
:double smth=strtod(ss,NULL,10);
可以使用稍微不同的语法。有关示例,请参阅this。
答案 1 :(得分:3)
你的问题是 CAST不是转换:
char *ss = "-1964734.544";
cout<<ss<<endl;
cout<<*reinterpret_cast<double*>(ss)<<endl;
cout<<*(double *)ss<<endl;
是您将一串字符转换为数字。这意味着你的记忆包含的数字是ascii值:
"-1964734.544"
以内容存储在内存中:
45, 49, 57, 54, 52, 55, 51, 52, 46, 53, 52, 52
二进制的变为:
00101101,00110001,00111001,00110110,00110100,00110111,00110011,00110100,00101110,00110101,00110100,00110100
在记忆中。当转换为double时,您强制编译器将这些数字视为以不同方式读取,这是在IEEE754 way for doubles之后。然后45,49,57,52意味着使用数字编码完全不同的东西。
然后,考虑到字符是8位和双32位,在演员之后,你的记忆然后按以下方式映射:
00101101001100010011100100110110,
00110100001101110011001100110100,
00101110001101010011010000110100
然后做一个&#34;手册&#34;对IEEE754的解释你得到三个浮点数:
1.0073988518377597E-11
1.7061830703823944E-7
4.120100094429091E-11
奇怪的是,你没有匹配任何你的值,所以你的记忆大小可能会有所不同,或者在演员表中会发生一些魔法。
好方法是不重新解释内存,而是转换值,一个好的解决方案是使用C中的strtod()
或C ++标准库中的stod
。您将找到许多方法来处理其他答案中的转换或复制此转换的帖子。
如果您想获得更多乐趣,请尝试floats on that webpage。
答案 2 :(得分:2)
您应该使用std::stod
函数(C ++ 11)和更现代的编译器
double result = std::stod(ss);
或者使用std::stringstream
<sstream>
std::stringstream sstrm(ss);
double d;
sstrm >> d;
答案 3 :(得分:-1)
如果您使用强制转换然后将指针数据视为双精度值,这是错误的,因为指针是表示内存中地址的整数,您需要解释char*
指向的数据以获得正确的结果,使用sscanf
,atof
或其他功能char*
并提供double
答案 4 :(得分:-1)
https://msdn.microsoft.com/en-us/library/aa272023%28v=vs.60%29.aspx
使用atof(const char*)
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
double pi;
const char * str = "3.14";
pi = atof(str);
cout << pi << endl;
return 0;
}
答案 5 :(得分:-1)
除非使用字符集reinterpret_cast
在内存中表示值-1964734.544
的浮点变量,否则{'-', '1', '9', '6', '4', '7', '3', '4', '.', '5', '4', '4'}
方法不太可行。
没有浮点值以这种方式表示在内存中。周期。
如果您需要C解决方案,请使用sscanf()
,strtod()
等功能。由于向后兼容性,这些在C ++中是可能的,但大多数都被正式弃用。
C ++解决方案将涉及使用istringstream
,例如;
#include <sstream>
#include <iostream>
int main()
{
std::istringstream s("-1964734.544");
double x;
if (s >> x)
std::cout << " x = " << x << '\n';
else
std::cout << "Whoops! String cannot be interpreted as floating point\n";
return 0;
}