Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从长位加倍_C++_Gcc_Double_Long Integer - Fatal编程技术网

C++ 从长位加倍

C++ 从长位加倍,c++,gcc,double,long-integer,C++,Gcc,Double,Long Integer,我有一个unsigned long-long(或uint64\u t)值,希望将其转换为双精度。double的位模式应与long值相同。这样我就可以“手动”设置双精度计数器的位 我正在寻找一种方法来做到这一点。小心联合和重新解释转换(&bit),因为这两种方法都是UB。几乎所有你能做的就是memcpy。可移植的方法是使用memcpy(你也可以有条件地使用reinterpret\u cast或一个联合,但这些不一定是可移植的,因为它们违反了严格的别名规则): 但在您这样做之前,请确保您确切地知道自

我有一个
unsigned long-long
(或
uint64\u t
)值,希望将其转换为
双精度
。double的位模式应与
long
值相同。这样我就可以“手动”设置双精度计数器的位


我正在寻找一种方法来做到这一点。

小心
联合
重新解释转换(&bit)
,因为这两种方法都是UB。几乎所有你能做的就是memcpy。

可移植的方法是使用
memcpy
(你也可以有条件地使用
reinterpret\u cast
或一个联合,但这些不一定是可移植的,因为它们违反了严格的别名规则):


但在您这样做之前,请确保您确切地知道自己在做什么,以及使用了什么样的浮点表示(尽管IEEE754是一种流行/常见的选择)。您将希望避免各种问题值,如无穷大、NaN和非规范数。

以下使用空指针

unsigned long long bits = 1ULL;
void* tempPtr=(void*)&bits;
double result = *(double*)tempPtr;

你是在问怎么做?在C99中,你可以合法地通过工会来解决这个问题。在C++中,你必须使用<代码> MycPy.()/<代码>。如果你感觉像是一个危险的坏蛋,你的工具O选择会像一个未定义的行为——严格的混叠违反。这与dasblinkenlight的答案相同,但具有完全无意义的临时性。我知道我的答案与dasblinkenlight的答案相同,但由于它使用了完全不同的语法,因此看起来是不同的方法。因此,我觉得这是适当的张贴作为一个问题的答案。至于它是未定义的行为这一事实,我不知道有哪一个编译器或系统不能处理它(前提是两个变量的大小相同)。添加临时变量是完全没有意义的,方法是相同的。还有,这是未定义的行为,就是这样。谢谢你的解释。我相信标准实际上允许你在这种情况下“重新解释_cast(bits)”,因为这两种类型都是标准布局,假设double不需要更严格的对齐。@Saksham是的,他说的“UB”是指未定义的行为。
// First, static assert that the sizes are the same
memcpy(&result, &bits, sizeof(bits));
unsigned long long bits = 1ULL;
void* tempPtr=(void*)&bits;
double result = *(double*)tempPtr;