将uint64_t格式的十六进制数转换为C ++中的double

时间:2015-08-25 20:04:02

标签: c++ hex reinterpret-cast

说,我有一个profiler方法,它以十六进制格式返回uint64_t值。我想以十进制格式显示此值。

有没有一种简单的方法可以在不使用标准c ++库的情况下执行此操作?预期输出在微秒范围内。我从分析器获得的样本值是0x9f0340。

3 个答案:

答案 0 :(得分:3)

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

uint64_t的范围不能超过double的范围,但转换过程中可能会有一些精度损失。这源于internal representation of a double,它总共使用64位:符号为1位,指数为11位,尾数为53-54。相反,uint64_t使用64位作为值。

附近的时间戳可能具有相同的double值。因此,从另一个中减去一个将提供与uint64的差异,但作为双精度为零。

在c语言中从一个转换为另一个的常用方法在c ++中也很有效:

uint64_t val64 = 892749724729742uL;
double d = val64;

答案 1 :(得分:0)

使用static_cast

keyFile <- "TwitterAPI-App-51ca9b46ce60.json"
endpoint <- oauth_endpoint(authorize= "https://www.googleapis.com/oauth2/v3/token", 
                          access = "https://www.googleapis.com/oauth2/v3/token", 
                           base_url = "https://www.googleapis.com")
# endpoint <- oauth_endpoints("google") # default is for accounts.google.com, I need GCP access

secrets <- jsonlite::fromJSON(keyFile)
scope <- "https://www.googleapis.com/auth/devstorage.read_write"

gtoken <- oauth_service_token(endpoint, secrets, scope) => GCP token fails, google account works

reinterpret_cast说'那些位真的是双重',但它们不是。

答案 2 :(得分:-2)

假设您尝试将这些位重新解释为double,那么在C ++中执行此操作的完全安全,可移植的方法是使用memcpy

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