在c ++中浮点到int数转换

时间:2013-07-21 16:49:03

标签: c++ int

以下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,但那么输出行为背后的原因是什么?

2 个答案:

答案 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 ++需要 整数使用纯二进制表示,约束 表达有点。它还需要非常大 浮点值的范围,或多或少需要一些 指数表示法的形式,有些位表示 指数,其他是尾数。用不同的编码 每。