C++ 在C+中将无符号int重新解释为浮点+;
我有一个浮点表示,它存储在一个无符号的_int32中。我知道,您可以重建数字字节移位,正如回答此问题时所述: 我想避免移位、乘法和和,只是重新解释位。我尝试了Wikipedia的IEEE 754单精度条目示例,但重新解释的结果是0 这是我的密码:C++ 在C+中将无符号int重新解释为浮点+;,c++,casting,int,C++,Casting,Int,我有一个浮点表示,它存储在一个无符号的_int32中。我知道,您可以重建数字字节移位,正如回答此问题时所述: 我想避免移位、乘法和和,只是重新解释位。我尝试了Wikipedia的IEEE 754单精度条目示例,但重新解释的结果是0 这是我的密码: unsigned __int32 integer = 0; unsigned __int32 mask = 0; mask = mask + 1 << 30; mask = mask + 1 << 29; mask =
unsigned __int32 integer = 0;
unsigned __int32 mask = 0;
mask = mask + 1 << 30;
mask = mask + 1 << 29;
mask = mask + 1 << 28;
mask = mask + 1 << 27;
mask = mask + 1 << 26;
mask = mask + 1 << 22;
integer = integer ^ mask;
printf("%ld %d\n", integer, sizeof(__int32));
float* decimal = reinterpret_cast<float*>(&integer);
printf("%f", *decimal);
return 0;
无符号uuu int32整数=0;
无符号uuu int32掩码=0;
mask=mask+1这里最有可能的问题是,两个不同类型(非字符)的指针指向同一内存位置,这违反了严格的别名规则
对于您的问题,最简单、最直接的解决方案就是memcpy
字节(在断言整数和浮点类型的大小相同之后):
试着打印出掩码
,以验证它是否符合您的预期,然后阅读相关内容。这大致上就是我将如何尝试按照您所说的去做的。你在对抗什么CPU?不同的汇编器以不同的方式(存储int、加载浮点、转换直接等)执行此操作。在调试器中查看汇编器输出应该可以为您提供有关此处出错原因的线索。啊,立即使用括号或屏蔽所有位是@Praetorian明智的建议。:)重新解释比特正是您的重新解释cast
所做的。我不知道你到底想要达到什么目的。顺便说一句,你可以做float decimal=reinterpret\u cast(整数)代码>---不需要指针。
float decimal = 0.0f;
memcpy(&decimal, &integer, sizeof(integer));