C++ - 将 float 转换为 unsigned char 数组,然后再转换回 float
C++ - Convert float to unsigned char array and then back to float
当我尝试将 float 转换为 unsigned char 数组然后再转换回 float 时,我没有得到原始 float 值。即使当我查看浮点数组的位时,我也看到了一堆与最初设置不同的位。
这里是我在Qt Console应用项目中做的一个例子。
编辑:我下面的原始代码包含评论中指出的一些错误,但我想明确说明我的意图,以免将来访问此问题的访问者感到困惑。
我基本上是在尝试将这些位移位并将它们“或”为一个浮点数,但我忘记了移位部分。另外,我现在认为您不能对浮点数进行按位运算。无论如何,这有点老套。我还认为 std::bitset 构造函数在 C++11 中接受了更多类型,但我不认为这是真的,所以它被隐式地转换了。最后,在尝试转换为我的新浮点数时,我应该一直使用 reinterpret_cast。
#include <QCoreApplication>
#include <iostream>
#include <bitset>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
const float f = 3.2;
unsigned char b[sizeof(float)];
memcpy(b, &f, sizeof(f));
const float newF = static_cast<float>(b[0] | b[1] | b[2] | b[3]);
std::cout << "Original float: " << f << std::endl;
// I expect "newF" to have the same value as "f"
std::cout << "New float: " << newF << std::endl;
std::cout << "bitset of original float: " << std::bitset<32>(f) << std::endl;
std::cout << "bitset of combined new float: " << std::bitset<32>(newF) << std::endl;
std::cout << "bitset of each float bit: " << std::endl;
std::cout << " b[0]: " << std::bitset<8>(b[0]) << std::endl;
std::cout << " b[1]: " << std::bitset<8>(b[1]) << std::endl;
std::cout << " b[2]: " << std::bitset<8>(b[2]) << std::endl;
std::cout << " b[3]: " << std::bitset<8>(b[3]) << std::endl;
return a.exec();
}
这是上面代码的输出:
Original float: 3.2
New float: 205
bitset of original float: 00000000000000000000000000000011
bitset of combined new float: 00000000000000000000000011001101
bitset of each float bit:
b[0]: 11001101
b[1]: 11001100
b[2]: 01001100
b[3]: 01000000
之前的回答和评论已被删除(不知道为什么)导致我使用 memcpy。
const float f = 3.2;
unsigned char b[sizeof(float)];
memcpy(b, &f, sizeof(f));
float newF = 0.0;
memcpy(&newF, b, sizeof(float));
当我尝试将 float 转换为 unsigned char 数组然后再转换回 float 时,我没有得到原始 float 值。即使当我查看浮点数组的位时,我也看到了一堆与最初设置不同的位。
这里是我在Qt Console应用项目中做的一个例子。
编辑:我下面的原始代码包含评论中指出的一些错误,但我想明确说明我的意图,以免将来访问此问题的访问者感到困惑。
我基本上是在尝试将这些位移位并将它们“或”为一个浮点数,但我忘记了移位部分。另外,我现在认为您不能对浮点数进行按位运算。无论如何,这有点老套。我还认为 std::bitset 构造函数在 C++11 中接受了更多类型,但我不认为这是真的,所以它被隐式地转换了。最后,在尝试转换为我的新浮点数时,我应该一直使用 reinterpret_cast。
#include <QCoreApplication>
#include <iostream>
#include <bitset>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
const float f = 3.2;
unsigned char b[sizeof(float)];
memcpy(b, &f, sizeof(f));
const float newF = static_cast<float>(b[0] | b[1] | b[2] | b[3]);
std::cout << "Original float: " << f << std::endl;
// I expect "newF" to have the same value as "f"
std::cout << "New float: " << newF << std::endl;
std::cout << "bitset of original float: " << std::bitset<32>(f) << std::endl;
std::cout << "bitset of combined new float: " << std::bitset<32>(newF) << std::endl;
std::cout << "bitset of each float bit: " << std::endl;
std::cout << " b[0]: " << std::bitset<8>(b[0]) << std::endl;
std::cout << " b[1]: " << std::bitset<8>(b[1]) << std::endl;
std::cout << " b[2]: " << std::bitset<8>(b[2]) << std::endl;
std::cout << " b[3]: " << std::bitset<8>(b[3]) << std::endl;
return a.exec();
}
这是上面代码的输出:
Original float: 3.2
New float: 205
bitset of original float: 00000000000000000000000000000011
bitset of combined new float: 00000000000000000000000011001101
bitset of each float bit:
b[0]: 11001101
b[1]: 11001100
b[2]: 01001100
b[3]: 01000000
之前的回答和评论已被删除(不知道为什么)导致我使用 memcpy。
const float f = 3.2;
unsigned char b[sizeof(float)];
memcpy(b, &f, sizeof(f));
float newF = 0.0;
memcpy(&newF, b, sizeof(float));