2013-03-20 73 views
0

我有一个存储在unsigned __int32中的浮点型表示。我知道,你可以重建数字节转移,就像指示在这个问题的答案:将无符号整数重新解释为C++中的浮点数

Convert int to float in C (no casting)

我想避免的移位,乘法和资金,只是重新诠释位。我尝试了IEEE 754单精度入境,但在0

这里重新解释结果维基百科的例子是我的代码:

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; 
+3

尝试打印出来的'mask'到验证它是你期望它是什么,然后阅读[运算符优先顺序](http://en.cppreference.com/w/cpp/language/operator_precedence)。 – Praetorian 2013-03-20 18:00:11

+0

这看起来大概如何我会尽力去做你说的话。你在这里工作的CPU是什么?各种汇编程序以不同的方式执行此操作(存储int;加载float;直接转换;等等)。在调试器中查看汇编程序输出应该能够让您知道哪里出了问题。 – 2013-03-20 18:02:17

+0

啊,用括号括起来或掩饰你所有的东西是@Praetorian明智地暗示的。 :) – 2013-03-20 18:03:10

回答

2

最有可能这里的问题是,你被违反了严格的别名规则有两个不同类型的(非字符)指针指向同一个内存位置。

最简单,最直接的解决问题的方法就是要memcpy字节(声称你整后的大小和float类型相同):

float decimal = 0.0f; 
memcpy(&decimal, &integer, sizeof(integer)); 
+0

谢谢,它肯定会诀窍 – user2191981 2013-03-20 20:52:17