C++ C/C++;用十六进制初始化double

C++ C/C++;用十六进制初始化double,c++,double,hex,uint64,C++,Double,Hex,Uint64,我想用一个十六进制常量初始化一个double double dbl = 0xFEDCBA9876543212; printf("dbl: %llX\n", (uint64_t)dbl); 我希望看到的结果是: dbl: FEDCBA9876543212 但我得到了: dbl: FEDCBA9876543000 为什么会出现这种情况,为什么会删除最后3个字节 ,这就是为什么在剩余位置上得到零。您使用64位值来初始化一个double,它只包含53个有效位。有一位舍入,剩下的位就丢失了。如果您只

我想用一个十六进制常量初始化一个double

double dbl = 0xFEDCBA9876543212;
printf("dbl: %llX\n", (uint64_t)dbl);
我希望看到的结果是:

dbl: FEDCBA9876543212
但我得到了:

dbl: FEDCBA9876543000

为什么会出现这种情况,为什么会删除最后3个字节

,这就是为什么在剩余位置上得到零。

您使用64位值来初始化一个double,它只包含53个有效位。有一位舍入,剩下的位就丢失了。

如果您只是想进行memcpy风格的事务,您可以尝试:

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

如您所见,底层二进制值在从
x
传递到
dbl
传递到
y
时保持不变,即使您当前的测试
printf(“dbl:%llX\n”,(uint64_t)dbl)会产生意外的输出。

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

0x1.01234567898abcp-12

然后用
printf(“%p”,number)打印数字在另一端组装好号码后。如果位数正确,则数字应与输入匹配

除了公认的答案,您还可以使用联合

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

这样做可能要花费数十亿美元!看到了吗,这里……由于本身是64位数据类型,
double
不能代表64位整数值的全部精度,因为它还需要指数部分的空间。在你最喜欢的搜索引擎中输入“每个计算机科学家都应该知道的关于浮点的知识”。@DavidSchwartz我很乐意,如果你在这里给出实际的链接:你正在将一个整数值分配给一个
double
——我的猜测是,你实际上想要将一个按位等效的值分配为
double
,在这种情况下,你需要按照Zak的建议使用
reinterpret\u cast
。不,不是固定的。我所说的位是隐藏的,与符号分开存在。看起来他有double的十六进制表示,并希望将其存储在double中。@rcgldr我看不出这在问题的任何地方都有暗示。他明确说明了他期望的输出,他分配给dbl的同一个64位数字。我如何在C中做相同的事情?@Noah:
double dbl=*(double*)&x
uint64\u t y=*(uint64\u t*)&dbl
0x1.01234567898abcp-12
union
{
    long long _double_exact;
    double _double;
};
double_exact = 0xFEDCBA9876543212;