【发布时间】:2014-01-27 03:43:37
【问题描述】:
我正在使用 HIDAPI 将一些数据发送到 USB 设备。此数据只能作为 byte 数组发送,我需要在此数据数组中发送一些 float 数字。我知道花车有4 字节。所以我认为这可能有效:
float f = 0.6;
char data[4];
data[0] = (int) f >> 24;
data[1] = (int) f >> 16;
data[2] = (int) f >> 8;
data[3] = (int) f;
后来我要做的就是:
g = (float)((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | (data[3]) );
但是测试这表明我像data[0] = (int) f >> 24; 这样的行总是返回0。我的代码有什么问题以及如何正确执行此操作(即,在 4 char 字节中破坏 float 内部数据并稍后重建相同的 float)?
编辑:
我能够使用以下代码完成此操作:
float f = 0.1;
unsigned char *pc;
pc = (unsigned char*)&f;
// 0.6 in float
pc[0] = 0x9A;
pc[1] = 0x99;
pc[2] = 0x19;
pc[3] = 0x3F;
std::cout << f << std::endl; // will print 0.6
和
*(unsigned int*)&f = (0x3F << 24) | (0x19 << 16) | (0x99 << 8) | (0x9A << 0);
我知道memcpy() 是一种“更干净”的方式,但我认为这种方式的性能要好一些。
【问题讨论】:
-
(int)f >> 24返回0的原因是int转换为f首先等于0:转换将浮动发送到它的地板。这是未定义的行为,但要以这种骇人听闻的方式进行操作,您需要像*(int*)&f >> 24这样的东西。
标签: c floating-point