如何将 char* 转换为 double?

has*_*e_0 0 c++

我尝试了两种方法将我的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;
}
Run Code Online (Sandbox Code Playgroud)

结果是:

-1964734.544
3.06123e-057
3.06123e-057
Run Code Online (Sandbox Code Playgroud)

我不清楚出了什么问题以及如何将 a 转换char*为 double 。

zmo*_*zmo 7

你的问题是A CAST 不是 CONVERSION

char *ss = "-1964734.544";
cout<<ss<<endl;
cout<<*reinterpret_cast<double*>(ss)<<endl;
cout<<*(double *)ss<<endl;
Run Code Online (Sandbox Code Playgroud)

是您将字符串转换为数字。这意味着您的内存中包含的数字是 ascii 值:

"-1964734.544"
Run Code Online (Sandbox Code Playgroud)

在内存中存储为:

45, 49, 57, 54, 52, 55, 51, 52, 46, 53, 52, 52
Run Code Online (Sandbox Code Playgroud)

二进制变为:

00101101,00110001,00111001,00110110,00110100,00110111,00110011,00110100,00101110,00110101,00110100,00110100
Run Code Online (Sandbox Code Playgroud)

记忆之内。转换为 double 时,您将强制编译器考虑以不同方式读取这些数字,这遵循double 的 IEEE754 方式。然后 45,49,57,52 使用数字编码意味着完全不同的东西。

然后,考虑到字符是 8 位和双精度 32 位,在转换之后,您的内存将按以下方式映射:

00101101001100010011100100110110,
00110100001101110011001100110100,
00101110001101010011010000110100
Run Code Online (Sandbox Code Playgroud)

然后对 IEEE754 进行“手动”解释,您将得到三个浮点数:

1.0073988518377597E-11
1.7061830703823944E-7
4.120100094429091E-11
Run Code Online (Sandbox Code Playgroud)

奇怪的是,与您的任何值都不匹配,因此您的内存大小可能不同,或者在转换过程中发生了一些魔法。

好的方法是不重新解释内存,而是转换值,一个好的解决方案是使用strtod()来自C,或者stod来自C++的标准库。您会在其他答案或重复此答案的帖子中找到许多处理转换的方法。

如果您想获得更多乐趣,只需尝试该网页上的浮动即可。