将uint64_t格式的十六进制数转换为c++中的双进制数

Converting hexadecimal number in uint64_t format to double in C++

本文关键字:c++ 转换 uint64 格式 十六进制数      更新时间:2023-10-16

说,我有一个分析器方法,返回十六进制格式的uint64_t值。我想用十进制格式显示这个值。

有没有一种简单的方法来做到这一点,而不使用标准的c++库?期望的输出在微秒范围内。我从分析器中得到的一个样例值是0x9f0340。

首先,uint64_t本身不是十六进制、八进制或十进制:它只是一个值。除非,也许,它的64位值有一些其他编码?

uint64_t的范围不能超过double的范围,但在转换过程中可能会有一些精度损失。这源于双精度数的内部表示,它总共使用64位:1位用于符号,11位用于指数,53-54位用于尾数。相比之下,uint64_t使用64位作为值。

附近的时间戳可能具有相同的double值。因此,用另一个减去一个会得到一个差值为uint64,但作为双精度数为零。

在c中从一种转换到另一种的常用方法在c++中也很有效:

uint64_t val64 = 892749724729742uL;
double d = val64;

use static_cast

double val = static_cast<double>(executionTime);

reinterpret_cast说'这些位实际上是双精度',但它们不是。

假设您试图将位重新解释为双值,在c++中完全安全,可移植的方法是使用memcpy:

uint64_t executionTime = profilerObj.getTime; //for example 0x9f0340
double executionTimeAsDouble = 0.0;
memcpy(&executionTimeAsDouble, &executionTime, sizeof(executionTimeAsDouble);
cout << "Execution time is : " << executionTimeAsDouble;