如何将字节从 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));
大多数编译器只会为此生成几条指令。
我有二进制文件,我从中读取了 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));
大多数编译器只会为此生成几条指令。