我想将浮点数的存储转换为整数(“数字”值不必相等)。

如果浮点数(例如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/

10-08 22:03