我正在尝试用4个复合字节构建一个32位浮点数.有没有比使用以下方法更好(或更便携)的方法?
#include <iostream>
typedef unsigned char uchar;
float bytesToFloat(uchar b0, uchar b1, uchar b2, uchar b3)
{
float output;
*((uchar*)(&output) + 3) = b0;
*((uchar*)(&output) + 2) = b1;
*((uchar*)(&output) + 1) = b2;
*((uchar*)(&output) + 0) = b3;
return output;
}
int main()
{
std::cout << bytesToFloat(0x3e, 0xaa, 0xaa, 0xab) << std::endl; // 1.0 / 3.0
std::cout << bytesToFloat(0x7f, 0x7f, 0xff, 0xff) << std::endl; // 3.4028234 × 10^38 (max single precision)
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用HIDAPI将一些数据发送到USB设备.这个数据只能作为字节数组发送,我需要在这个数据数组中发送一些浮点数.我知道浮点数有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;
Run Code Online (Sandbox Code Playgroud)
后来我所要做的就是:
g = (float)((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | (data[3]) );
Run Code Online (Sandbox Code Playgroud)
但测试这一点告诉我,像float返回的线总是4.我的代码出了什么问题,我怎么能正确地做到这一点(即在4个字节字节中打破浮点内部数据并在以后重建同一个浮点数)?
编辑:
我能够用以下代码完成此任务:
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; …Run Code Online (Sandbox Code Playgroud) 我想将一个浮点数(例如2.45)转换为4字节的char数组.所以2.45应该看起来像是 '@' 'FS' 'Ì' 'Í'二元的ieee表示2.45 = 01000000 00011100 11001100 11001101?
我已经解决了这个问题,但它的复杂性很差.你有什么好主意吗?
谢谢你的好答案.
你能告诉我从char数组回到浮点数的方法吗?
我想将转换float为unsigned long,同时保持的二进制表示float(所以我不希望投5.0给5!).
这很容易通过以下方式完成:
float f = 2.0;
unsigned long x = *((unsigned long*)&f)
Run Code Online (Sandbox Code Playgroud)
但是,现在我需要在a中做同样的事情#define,因为我想稍后在一些数组初始化中使用它(所以[inline]函数不是一个选项).
这不编译:
#define f2u(f) *((unsigned long*)&f)
Run Code Online (Sandbox Code Playgroud)
如果我这样称呼它:
unsigned long x[] = { f2u(1.0), f2u(2.0), f2u(3.0), ... }
Run Code Online (Sandbox Code Playgroud)
我得到的错误是(逻辑上):
lvalue required as unary ‘&’ operand
Run Code Online (Sandbox Code Playgroud)
注意:下面建议的一个解决方案是union为我的数组使用一个类型.但是,这是没有选择的.我实际上在做以下事情:
#define Calc(x) (((x & 0x7F800000) >> 23) - 127)
unsigned long x[] = { Calc(f2u(1.0)), Calc(f2u(2.0)), Calc(f2u(3.0)), ... }
Run Code Online (Sandbox Code Playgroud)
所以数组真的/必须是类型long[].
刚刚阅读了一些匿名结构以及它是如何不标准的,并且它的一些一般用例是未定义的行为......
这是基本情况:
struct Point {
union {
struct {
float x, y;
};
float v[2];
};
};
Run Code Online (Sandbox Code Playgroud)
因此,写入x然后从v [0]读取将是未定义的,因为您可能期望它们是相同的,但可能不是这样.
不确定这是否属于标准,但同类型的工会......
union{ float a; float b; };
是否未定义写入a然后从b读取?
也就是说,标准是否说明了关于数组的二进制表示和相同类型的顺序变量.