问题描述
我有一个二进制文件,我从中读取了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标准库。