2

以下は有効な表現ですか? 私はバイトオーダーを認識しています。これはWindows環境です。私が定義した場合Int32Double myVar; が計算値のmyVar.int32.low場合、常に同じになりますか? 例えば:myVar.d
myVar.d = 0.4 * log(4); printf("%08X\n", myVar.int32.low);

union Int32Double
{
    struct
    {
        int low;
        int high;
    } int32;

    double d;
};
4

2 に答える 2

3

dいいえ、それは への書き込みと からの読み取りの未定義の動作int32です。

于 2012-11-12T21:29:00.690 に答える
2

まず、通常、整数型と浮動小数点型のオブジェクト表現は大きく異なります。doubleオブジェクトの一部をオブジェクトとして再解釈してもint、通常、元の値に似た値は生成されませんdouble。自分が何をしているのかを本当に理解していない限り、結果は意味がありません。そして、自分が何をしているのかを知っている場合は、再解釈のために符号なし整数型を使用します。

第 2 に、メモリの再解釈に共用体を使用することは、C++ では違法です。未定義の動作につながります。C99 仕様に対する最新の技術的正誤表の 1 つは、実際に C 言語で合法化しました (もちろん、実装定義の動作で、トラップ表現にアクセスしようとしない限り)。しかし、知る限り、C++ にはまだありません。したがって、自己責任で使用してください。

PS「いつも同じ」というのが何を意味するのかわかりません...

于 2012-11-12T21:47:27.863 に答える