我将unsigned long转换为Float单精度时遇到问题 这是我的问题
我需要在我的程序中以浮点进行通信,但我的所有内部变量都是无符号长的,所以我们决定的设计是这样的,所有内容都保持不变,(在unsigned long中)并且一旦需要浮点数应用程序,我将转换为浮动并传递它。
因此,根据
,所有变量都将具有IEEE 754比特流我遵循的步骤:
在调试器中,我看到步骤1和2的相同位模式(在缓冲区中)
在步骤3中,我看到相同的二进制模式,但该值不被解释为float
输入:21.125
十进制:1101594624
Code:
void ApplicationApi(void * DataPtr)
{
(*(float32*)((void*)DataPtr))= unsignedLong_val;
}
应用程序DataPtr的结果 * DataPtr = 1.101594624 * e9
我在这里遗漏了什么或类型案例有效吗?
答案 0 :(得分:0)
将unsigned long
的字节重新解释为float
的标准C方法是:
y = (union { unsigned long u; float f; }) { x } .f;
此代码定义了一个复合文字,它是一个联合,它使用x
的值初始化联合,该unsigned long
应为f
。然后它访问联合的float
成员,即float
。此y
值已分配给float
,该值应为ApplicationApi
。
因此,假设void *DataPtr
的声明必须保持不变并且传递float
是将指针转换为void
指向{{1}的结果},它的定义可能是:
void ApplicationApi(void *DataPtr)
{
* (float32 *) DataPtr =(union { unsigned long u; float32 f; }) { unsignedLong_val } .f;
}
关于此代码的说明:
unsigned long
和float32
具有相同的尺寸。unsignedLong_val
不希望有文件范围。最好将其作为参数传递。void *
传递。它可以作为float32 *
传递。关于导致此代码的代码的注释:
unsigned long
中汇总字节的方式可能会产生字节序问题。unsigned long
可能有陷阱值,无法用于保存任意字节。关于C标准并重新解释字节:
.
运算符的表达式和成员名称具有指定成员的值。标准的注释95表示这可用于重新解释字节。memcpy
有时用于此。)< / LI>
答案 1 :(得分:-1)
尝试使用此演员:
void ApplicationApi(void * DataPtr)
{
*(float32*)DataPtr = *(float32*)unsignedLong_val;
}
您必须声明正确的值是浮点值 使用您的强制转换,正确的值是一个整数,左边的值是一个浮点数。编译器将整数隐式转换为浮点值。