質問

い符号なしlong整数値を表すfloatを使用IEEE-754形式です。何が最も近道だとの印刷でのfloatとしてC++?

んとコミュニケーションを重ねなが疑問がある場合に便利なユC++る方がよいでしょう。

あうことができればいいです:

union
{
    unsigned long ul;
    float f;
} u;

u.ul = 1084227584; // in HEX, this is 0x40A00000

cout << "float value is: " << u.f << endl;

(このプリントアウトしたりすること"float値は以下の通りです:5")

役に立ちましたか?

解決

Eu法のご提案が通常の経路がほとんどの人とはどのようなものか。しかし、この技術 未定義の動作 C/C++の読み取りに別の委員からはunionた最近では書かれています。しかも、などを紹介している間にほとんどすべてのコンパイラでコンパイル.

鋳造のポインタとして Jon Skeetことを示唆, あるのは悪いこと--に違反する行為 厳しいエイリアシング ルールのようなリスクがあるという積極的な最適化コンパイラを演出しまなコードここではポインタの種類 unsigned long *float * な別名です。

最も正しい方法で、基準の遵守(せを呼び出しません)をキャストによ char*, 以降の厳しいエイリアシングルールを可能に char* ポインタをエイリアスポインタのその他の型:

unsigned long ul = 0x40A00000;
float f;
char *pul = (char *)&ul;  // ok, char* can alias any type
char *pf = (char *)&f;    // ok, char* can alias any type
memcpy(pf, pul, sizeof(float));

でも正直にいたにも関わらず、euの方法です。からcellperformance.com 上記リンク:

で非常に共通ムですべての主要なコンパイラでコンパイル.実際問題として、読み書き会員の組合は、任意の順序で可能です。

他のヒント

これは、唯一のsizeof(長い)==のsizeof(フロート)32ビットマシンまたはマシン上で動作します。最近のマシン上では、int型の代わりに使用する場合があります...そして、あなたは本当にあなたがこのトリックを実行している場合は世話をする必要があります。

私はジョンスキートと同じことを考えていたが、彼はそれに私を打ちます。しかし、私はもう少し簡潔に、彼がやったよりも、それを行うだろう。

cout << "float value is: " << *((float *) &ulValue)) << endl;

これで、floatへのポインタとして、その後、フロートにポインタを参照解除するfloat値を生成することを再解釈し、あなたのunsigned long型へのポインタを取得します。

は、C ++でこれをやっているので、それは古いCスタイルのキャストの代わりにreinterpret_castは使用することが明確である。

cout << "float value is: " << *(reinterpret_cast<float *>(&ulValue)) << endl;

編集:私は以前、これは「ただ厄介な」と思ったが、それは私が思ったよりも悪いことが判明 - 詳細についてはコメントを参照してください。私はこのアプローチをお勧めしませんが、私は可能性が文書化するためにここにそれを残している(と警告を!)

<時間>

あなたはポインタを使用することができます:

long ul = 1084227584;
float* fp = (float*) &ul;
float f = *fp;

(これは、単一の行に凝縮することができますが、私はそれがないように明確だと思います。)

あなたの労働組合と基本的に同じもの...と同じように危険なあなたは、関連する型のサイズの確認していない限ります。

お使いのプラットフォームがサポートしている場合は、

、あなたはおそらく、整数と浮動小数点型の両方のサイズ固有のタイプ名を使用する必要があります。

swegiは右方向を持っていましたが、一つの文字を逃しました。正しい方法がある。

long l = 1084227584L
float f = reinterpret_cast<float&>(l);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top