我正在用C进行一些微控制器编程。我正在读取代表float
,int
或unsigned int
的4个字节的各种传感器。目前,我将它们以unsigned int
格式存储在微控制器中,即使数据可能是float
,因为对于微控制器它们只是字节。然后将该数据传输到PC。我希望PC可以随时将二进制数据解释为float
或int
或unsigned int
。有没有办法做到这一点?
实施例
unsigned int value = 0x40040000; // This is 2.0625 in double
double result = convert_binary_to_double(value); // result = 2.0625
感谢。
PS:我尝试过类型转换,但是没有用。
答案 0 :(得分:7)
请记住,您所要求的并非完全可移植,这样的事情可能会起到作用:
float value = *(float *)&bits;
另一个显而易见的可能性是使用联合:
typedef union {
unsigned int uint_val;
int int_val;
float float_val;
} values;
values v;
v.uint_val = 0x40040000;
float f = v.float_val;
要么可能正常工作,但都不能保证可移植性。
答案 1 :(得分:2)
最短的方法是将float
(resp int
)的地址转换为int
(resp float
)的地址,并取消引用:实例,double result = * (float*) &value;
。您的优化编译器可能会将此代码编译为无法按预期工作的内容(请参阅strict aliasing rules)。
更常用的方法是使用带有int
字段和float
字段的联合。
答案 2 :(得分:1)
你为什么不这样做:
double *x = &value;
还是工会?
答案 3 :(得分:1)
这是一个糟糕的工作:)
this talks about their representation in memory(根据IEEE754),因此对于各种按位运算,您必须从微控制器的输出中提取符号,指数和尾数,然后执行number = (-1)^e * mantissa ^ (exponent - 1023)
。
答案 4 :(得分:0)
你说“打字不起作用”是什么意思? 你究竟尝试了什么? 例如,你尝试过这样的事情:
double convert_binary_to_double(unsigned int value)
{
return *((double*)&value);
}
答案 5 :(得分:0)
对PC来说它们也只是字节,因此可以复制到任何4字节的Int,4字节无符号Int或4字节Float字段中,计算机会非常高兴。您需要将它们包裹起来,或以某种方式将它们标记为int,unsigned或float。编译器无法通过查看任何32位的位集合来判断它的类型是什么。 - 如果你需要更好的解释,请回复我,我会给你真正的长版本 - 乔 - 也许我误解了你的问题。我以为你想发送超过4个字节的数据,让计算机知道数据是否是32位Int,32位无符号或32位浮点数。没有其他信息,计算机无法知道答案。
答案 6 :(得分:0)
您是否尝试过使用itoa()功能?它是一个简洁的小函数,通常用于将int转换为ASCII。