gpt4 book ai didi

c++ - char* 加倍并再次返回 char*(64 位应用程序)

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:23:27 26 4
gpt4 key购买 nike

我正在尝试将 char* 转换为 double 并再次返回 char*。如果您创建的应用程序是 32 位但不适用于 64 位应用程序,则以下代码可以正常工作。当您尝试从 int 转换回 char* 时会出现问题。例如,如果 hello = 0x000000013fcf7888 则转换为 0x000000003fcf7888 只有最后 32 位是正确的。

#include <iostream>
#include <stdlib.h>
#include <tchar.h>
using namespace std;


int _tmain(int argc, _TCHAR* argv[]){

char* hello = "hello";
unsigned int hello_to_int = (unsigned int)hello;
double hello_to_double = (double)hello_to_int;

cout<<hello<<endl;
cout<<hello_to_int<<"\n"<<hello_to_double<<endl;

unsigned int converted_int = (unsigned int)hello_to_double;
char* converted = reinterpret_cast<char*>(converted_int);

cout<<converted_int<<"\n"<<converted<<endl;

getchar();
return 0;
}

最佳答案

在 64 位 Windows 上指针是 64 位的,而 int是 32 位的。这就是您在转换时丢失高 32 位数据的原因。而不是 int使用 long long保存中间结果。

char* hello = "hello";
unsigned long long hello_to_int = (unsigned long long)hello;

对反向转换进行类似的修改。但这并不能保证转换功能正确,因为 double 可以很容易地表示整个 32 位整数范围而不会损失精度,但对于 64 位整数则不然。

另外,这行不通

unsigned int converted_int = (unsigned int)hello_to_double;

该转换将简单地截断浮点表示形式中小数点后的所有数字。即使将数据类型更改为 unsigned long long 也存在问题.你需要 reinterpret_cast<unsigned long long>使其发挥作用。

即便如此,根据指针的值,您仍然可能会遇到麻烦。转换为 double例如,可能会导致该值为 信号 NaN,在这种情况下,您的代码可能会抛出异常。

简单的答案是,除非您是为了好玩而尝试,否则不要进行此类转换。

关于c++ - char* 加倍并再次返回 char*(64 位应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7560852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com