如何在双精度内存储uint64_t的位?

时间:2016-06-02 02:18:19

标签: c r

基本上我有some其实际价值我不在乎。我需要将它存储在uint64_t中,以便我可以轻松地将这些位存储在R中的对象中(如果你不知道那是什么,那很好,这对问题无关紧要)。 / p>

所以我想要的是将double的64位存储在uint64_t内,然后将double转换回原始{ {1}}。

我一直在撞墙上撞了很长一段时间(这是双关语吗?)所以非常感谢所有人的帮助!

2 个答案:

答案 0 :(得分:1)

如评论中所述,您可以使用memcpyuint64_t中的位复制到double

这是有效的,因为double的大小与uint64_t(8个字节)的大小相同。

但是,如果尝试显示值,则不会得到相同的结果。实际上,双重存储正值和负值,浮点数,而uint64_t是......无符号整数。

二进制表示是相同的,解释值是不同的。

答案 1 :(得分:-2)

C铸造中的

是你的朋友:

  • dbl = *(double *)(& ui64);
  • ui64 = *(uint64_t *)(& dbl);

示例:

#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>

double dbl_1 = 42.42;
uint64_t ui64_1;

double dbl_2;
uint64_t ui64_2 = 0x404535C28F5C28F6;

void main(void)
{
   ui64_1 = *(uint64_t*)(&dbl_1);
   printf("%" PRIx64 "\n", ui64_1);

   dbl_2 = *(double*)(&ui64_2);
   printf("%f", dbl_2); 
}

转化的重要资源: IEEE-754 Floating-Point Conversion

编辑:根据C标准,这是未定义的行为,尽管它可能有效,但这不是最佳做法。