C / C ++初始化双十六进制

时间:2014-09-18 22:12:03

标签: c++ double hex uint64

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

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

我希望看到输出:

dbl: FEDCBA9876543212

但我得到了:

dbl: FEDCBA9876543000

为什么这是为什么最后3个字节被删除?

5 个答案:

答案 0 :(得分:4)

您正在使用64位值初始化double,它只保存53个有效位。有一位四舍五入,其余的位只是丢失了。

答案 1 :(得分: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传递到dbly,即使您当前的测试printf("dbl: %llX\n", (uint64_t)dbl);产生意外输出

答案 2 :(得分:1)

double precision is 53 bits,这就是为什么你在剩余职位上获得零的原因。

答案 3 :(得分:1)

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

0x1.01234567898abcp-12

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

答案 4 :(得分:0)

除了可接受的答案,您还可以使用联合体

union
{
    long long _double_exact;
    double _double;
};
double_exact = 0xFEDCBA9876543212;