我想将浮点数的存储转换为整数(“数字”值不必相等)。
如果浮点数(例如10)以二进制形式(至少在我的实现中)表示为:
01000001001000000000000000000000
然后(同样在我的实现中)它应该表示整数值1092616192。
我目前正在通过以下方式进行操作:
union UNFI {
float a;
int b;
};
UNFI n;
n.a = 10;
int bits = n.b; // foo!
for (int i=31; i>=0; --i) {
bool bit = ((bits >> i) & 1);
std::cout << bit;
}
这实现了我想要的目标,但从本质上来说,这是未定义的行为。因此,我想知道实现这一结果的“正确”方法是什么。
根据C99标准:
With one exception, if the value of a member of a union object is used when the most recent store to the object was to a different member,the behavior is implementation-defined.
那不是未定义的行为吗?
最佳答案
正确的方法是调用memcpy
。大多数编译器会像联合一样将其优化为有效的单字内存访问,但是在具有额外对齐要求的平台上,他们会做正确的事情。而且它永远不会触发信号NaN。
float a = 10;
char bits[sizeof a];
memcpy(bits, &a, sizeof a);
要么
int b;
static_assert(sizeof b == sizeof a);
memcpy(&b, &a, sizeof a);
关于c++ - float 按位运算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5339728/