如何将字节从uint64_t转换为double?

问题描述

我有一个二进制文件,我从中读取了uint64_t val(使用little-endian)。现在,我想将此uint64_t转换为double(不仅是强制转换,而且如果从文件中输入,则确切地是double的数字)。因此,应该具有相同的位表示形式。我应该怎么做?

解决方法

简单的可移植方式:

uint64_t u64 = read_from_file();
double d;
memcpy(&d,&u64,sizeof(d));

大多数编译器将为此生成一些指令。

,

这是一种实现方法:

uint64_t val = someCodeThatReadsTheValue();
auto valPtr = &val;
double dVal = *reinterpret_cast<double*>(valPtr);

如评论中所指出,这是未定义的行为,尽管它在大多数编译器中都可以使用。

如果您不希望信任编译器,则可以执行以下操作。

uint64_t val1 = someCodeThatReadsTheValue();
double val2;
char* p1 = reinterpret_cast<char*>(&val1);
char* p2 = reinterpret_cast<char*>(&val2);
for(int i = 0; i < sizeof(uint64_t); i++)
    p2[i] = p1[i];

将其丢弃为一个有趣的事实,就像在@chqrlie的答案中那样使用memcpy更容易。除非您不能使用C标准库。