以下C ++代码:
union float2bin{
float f;
int i;
};
float2bin obj;
obj.f=2.243;
cout<<obj.i;
将输出作为一些垃圾值。
但是
union float2bin{
float f;
float i;
};
float2bin obj;
obj.f=2.243;
cout<<obj.i;
给出的输出与f的值相同,即2.243
编译器GCC有int&amp;相同大小的浮点数,即4,但那么输出行为背后的原因是什么?
答案 0 :(得分:1)
原因是因为浮点值以更复杂的方式存储,将32位划分为符号,指数和分数。如果这些位被直接读取为整数,它将看起来像一个非常不同的值。
这里重要的一点是,如果你创建一个联合,你就是说它是一个连续的内存块,可以用两种不同的方式解释。没有在这个机制中它在float和int之间进行安全转换的情况下,在这种情况下会发生某种舍入。
更新:您可能需要的是
float f = 10.25f;
int i = (int)f;
// Will give you i = 10
然而,工会方法更接近于此:
float f = 10.25f;
int i = *((int *)&f);
// Will give you some seemingly arbitrary value
答案 1 :(得分:1)
原因是因为它是未定义的行为。在实践中,
你会从那些东西中读出一个int
在大多数机器上存储为float
,但您将读取垃圾
值,除非你知道会发生什么。在另一个做它
方向可能会导致程序崩溃
值int
。
引擎盖当然是积分值和浮点数 值具有不同的表示,至少在大多数情况下 机器。 (在某些Unisys大型机上,您的代码会做什么 你期待。但他们并不是最常见的系统,并且 你可能没有桌面上的一个。)基本上, 无论类型如何,你都会有一系列的比特 由硬件以某种方式解释。 C ++需要 整数使用纯二进制表示,约束 表达有点。它还需要非常大 浮点值的范围,或多或少需要一些 指数表示法的形式,有些位表示 指数,其他是尾数。用不同的编码 每。