C++ 有没有一种方法可以在不进行类型转换或内存溢出的情况下将位从double复制到uint64中?

C++ 有没有一种方法可以在不进行类型转换或内存溢出的情况下将位从double复制到uint64中?,c++,casting,type-conversion,C++,Casting,Type Conversion,假设我有 uint64_t x = 0x3ff0000013300000; double y; 我想给y x的位;本质上是赋值y=x,除非不应进行浮点转换,因此在它的末尾,y将等于1.0000000714790076 我知道 y = reinterpret_cast<double*>(&x)[0]; y=reinterpret_cast(&x)[0]; 将完成这项任务,但我想知道的是,如果这可以在C++中完成而不溢出到内存中。p> 只要您完全确定sizeof(doubl

假设我有

uint64_t x = 0x3ff0000013300000;
double y;
我想给y x的位;本质上是赋值y=x,除非不应进行浮点转换,因此在它的末尾,y将等于1.0000000714790076

我知道

y = reinterpret_cast<double*>(&x)[0];
y=reinterpret_cast(&x)[0];

将完成这项任务,但我想知道的是,如果这可以在C++中完成而不溢出到内存中。p> 只要您完全确定

sizeof(double)
与平台上的
sizeof(uint64\u t)
相同,就可以使用
std::memcpy

uint64_t x = 0x3ff0000013300000;
double y;

static_assert(sizeof(x) == sizeof(y));
std::memcpy(&y, &x, sizeof(y));

memcpy导致内存丢失spill@MNagy这是什么呢?这意味着它需要从内存中提取,而内存往往有很高的延迟。如果我的内容不偏离当前寄存器,我会更喜欢它。@MNagy:是否可以从整数寄存器直接复制到浮点寄存器,完全取决于您的CPU体系结构。@MNagy您绝对确定memcpy会有您描述的行为吗?许多编译器会在简单的情况下完全省略memcpy,具体取决于目标体系结构。您称之为“内存溢出”的是什么?还要注意的是,无论你打算怎么做,从技术上讲,这都是未定义的行为,即使你断言这两种类型的大小相同。此时,应该有人问你为什么有这些特定的要求。可能我有这些特定的要求,因为我有一个密码散列函数,它在一组整数运算的中间有一个双浮点运算,在比特上没有浮点转换。在这里,事后猜测我想要什么是没有意义的。“在这里,事后猜测我想要什么是没有意义的”,但是,请您更清楚地说明您的要求是有意义的。@MNagy:因为您想要的是a)未定义的行为和b)依赖于平台(因此,您的问题标题的答案是“不,不合法”),您是否正确理解了这段代码/算法非常值得怀疑。尤其是在密码学领域,无论你想做什么都不是好兆头。。。无意冒犯。我们在这里尽力帮忙。