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

How to convert bytes from uint64_t to double?

我有二进制文件,我从中读取了 uint64_t val(使用小端)。现在我想将此 uint64_t 转换为 double(不只是强制转换,而是如果我从文件中输入它,则正好是 double 的数字)。所以 should 具有相同的位表示。我应该怎么做?

这是一种方法:

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];

将其作为一个有趣的事实而删除,使用 memcpy 更容易,就像@chqrlie 的回答一样。除非你不会用C标准库。

简单的便携方式:

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

大多数编译器只会为此生成几条指令。