说,我有一个profiler方法,它以十六进制格式返回uint64_t值。我想以十进制格式显示此值。
有没有一种简单的方法可以在不使用标准c ++库的情况下执行此操作?预期输出在微秒范围内。我从分析器获得的样本值是0x9f0340。
答案 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;