2009-03-28 18 views
12
int64_t a = 1234; 

    double d = (double) a; 

これはお勧めの方法ですか?int64_tをdoubleに変換する

+1

int64が必ずしもよくダブルにマップされるわけではありません。例えば、doubleの最大値とint64の最大値を比較します。 doubleには57ビットの整数があり、ダブルフォーマットでは表現できない整数をスキップしているよりも高いことにも注意してください。 int64は64ビットの整数を持っていますが、すべて隣の隣に1つあります。数値の範囲は非常に異なります。 –

答えて

6

あなたはstatic_castを使用するか、または代わりに、暗黙のキャストに頼らなければならない:strager答えとして

int64_t a = 1234; 
double d = static_cast<double>(a); 
double f = a; 
11

使用static_cast

  • 暗黙のキャストがあなたにノイズを加えることも意味し、コンパイラの警告の共通のソースです:私はいくつかの理由のために暗黙のキャスト(またはC++のソースコードでも、Cスタイルのキャスト)を使用してに対してをお勧めしますビルド(より良い警告フラグが追加された今、またはそれ以降)。
  • あなたの後ろにいるメンテナンスプログラマーは暗黙のキャストを見て、それが意図的な動作か間違い/バグかを知る必要があります。そのことをstatic_castとすると、の意図がすぐに明らかになります。
  • static_cast他のC++スタイルのキャストは、grepが処理するのが簡単です。
+4

"インテント":特に割り当てがdの宣言から遠い場合、static_cast はDRYに違反します。 d = static_cast (a)その点では優れていますが、私は生きる意志を失い、おそらくd = aは結局より良くなるでしょう;-) –

+0

あなたはDRYに違反しているのは正しいですが、あなたが前方宣言を考えるなら、言語はどんな形でもDRYではありません。また、IIRCのtypeof(d)にはRTTIとが必要であり、一部の環境では使用できません。 – Tom

+0

...あなたが正しいとはいえ、誰かが不完全なリファクタリングをした場合、DRY違反は不思議なコードを引き起こします。フロートd; d = static_cast (値); // WTF – Tom

3

PODタイプの場合、両方のバージョンで同じことが行われます。好きなものを選んで一貫性を保つ。

私は入力/可読性のために前者を好む多くの人を知っていますが、私はこれに同意する傾向がありますが、私はどちらかと一緒に暮らすことができます。

「grep for grep」の引数は何度も聞いたことがありますが、PODキャストのコードベースをgrepする必要がある状況はまだありません。

+2

+1、私はキャストのためにgrepする必要はなかった –

2

また、static_castに相当する、変換構文を使用することができます。

int64_t a = 1234; 
double d = double(a); 

これは、それがテンプレートコードに同じように扱われることを、プリミティブとクラスタイプを許可することに有用構文構造です、プリミティブに対してstatic_castを実行するか、クラス型に対してコンストラクタを呼び出します。

関連する問題