我想用一个十六进制常量初始化一个双精度型。
double dbl = 0xFEDCBA9876543212;
printf("dbl: %llX\n", (uint64_t)dbl);
我希望将其视为输出:
dbl: FEDCBA9876543212
但是我得到:
dbl: FEDCBA9876543000
为什么会这样,为什么最后3个字节会丢失?
如果您只想进行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
产生了意外的输出,基础二进制值仍保持从dbl
到y
到printf("dbl: %llX\n", (uint64_t)dbl);
的值。
您正在使用64位值初始化一个double,该double仅包含53个有效位。进行四舍五入,剩下的部分将丢失。
如果您想确切知道double的值,则使用double的十六进制格式,
0x1.01234567898abcp-12
然后在另一端组装好号码后,用printf("%p", number);
打印号码。如果您有正确的数字位数,则该数字应与输入内容匹配。
double
precision is 53 bits,这就是为什么剩余位置为零的原因。
除了接受的答案之外,您还可以使用并集
double