C / C ++用十六进制初始化双精度

问题描述 投票:2回答:5

我想用一个十六进制常量初始化一个双精度型。

double dbl = 0xFEDCBA9876543212;
printf("dbl: %llX\n", (uint64_t)dbl);

我希望将其视为输出:

dbl: FEDCBA9876543212

但是我得到:

dbl: FEDCBA9876543000

为什么会这样,为什么最后3个字节会丢失?

c++ double hex uint64
5个回答
2
投票

如果您只想进行memcpy风格的交易,可以尝试:

uint64_t x = 0xFEDCBA9876543212;
double dbl = *reinterpret_cast<double *>(&x);

此外,您的测试可能没有执行您想要的操作:

我的测试:

#include <cstdint>
#include <cstdio>

int main (void) {
  // Move the underlying hex value through multiple types
  uint64_t x = 0xFEDCBA9876543212;
  double dbl = *reinterpret_cast<double *>(&x);
  uint64_t y = *reinterpret_cast<uint64_t *>(&dbl);

  // Check integrity of the result
  printf("dbl: %llX\n", (uint64_t)dbl);  //your test
  printf("x: %llx\ny: %llx\n", x, y);  //my test

  return 0;
}

输出:

dbl: 8000000000000000
x: fedcba9876543212
y: fedcba9876543212

您可以看到,即使您当前的测试x产生了意外的输出,基础二进制值仍保持从dblyprintf("dbl: %llX\n", (uint64_t)dbl);的值。


4
投票

您正在使用64位值初始化一个double,该double仅包含53个有效位。进行四舍五入,剩下的部分将丢失。


2
投票

如果您想确切知道double的值,则使用double的十六进制格式,

0x1.01234567898abcp-12

然后在另一端组装好号码后,用printf("%p", number);打印号码。如果您有正确的数字位数,则该数字应与输入内容匹配。


1
投票

double precision is 53 bits,这就是为什么剩余位置为零的原因。


0
投票

除了接受的答案之外,您还可以使用并集

double
© www.soinside.com 2019 - 2024. All rights reserved.