0

次の 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 ie の値と同じ出力を与える2.243

コンパイラ GCC には int と float の同じサイズ、つまり 4 がありますが、この出力動作の背後にある理由は何ですか?

4

2 に答える 2

1

その理由は、浮動小数点値がより複雑な方法で格納され、32 ビットが符号、指数、および小数に分割されるためです。これらのビットがそのまま整数として読み取られると、非常に異なる値のように見えます。

ここで重要な点は、共用体を作成すると、2 つの異なる方法で解釈できる 1 つの連続したメモリ ブロックであるということです。このメカニズムでは、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
于 2013-07-21T16:55:25.513 に答える