我想将浮点数的存储转换为整数('number'值不需要相等)。
如果浮点数(例如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.
这不是未定义的行为吗?
答案 0 :(得分:3)
正确的方法是致电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);
答案 1 :(得分:0)
什么是未定义的?
IEEE浮点的布局非常明确,唯一的复杂因素是平台上的字节排序(以及int的大小)
答案 2 :(得分:0)
您所追求的是简单类型的软管。你在做什么似乎是最简单的事情。我认为另一种选择是指针转换。
int const bits = *(reinterpret_cast<int *>(&n))