2016-07-01 12 views
-1

これらの行は同じコンパイルコードを生成しますか?コンパイル時にリテラルが型キャストされていますか?

double one = 1.0; 
double one = 1.f; 
double one = 1; 

またはこの3つ?

float one = 1.0; 
float one = 1.f; 
float one = 1; 

編集

右側の値は実際には32ビットの浮動小数点

+2

両方に対応しています。これらの型変換はコンパイル時に行われます。 – T33C

+2

はい... – mvidelgauz

+3

値が "1"の場合は可能性が高いですが、一般的にはプラットフォーム/コンパイラに依存します。いくつかのdouble値(完全な倍精度を使用)では、 "f"で終わる行は異なるはずです(倍精度を完全に使用せず、精度を浮動小数点に切り捨てる)。 – Ped7g

答えて

7

コンパイル時の変換が実行時の変換と同等であることをコンパイラが証明できない限り、コンパイル時には変換できません。コンパイラがそれを証明することができ、多くのタイプのために、ほとんどのコンパイラはコンパイル時に変換を実行します。

しかし、あなたが与える例の1つは、タイプdoubleのリテラルからタイプfloatへの変換です。これはやりにくくなる。浮動小数点ステータスフラグをサポートするコンパイラ(FENV_ACCESSプラグマが使用されているときにCコンパイラがサポートする必要があるコンパイラでは、gccもclangもそのプラグマを実装していないにもかかわらず、このような変換では "不正確"例外が発生する可能性がありますdoubleからfloatへの変換は精度を失います。あなたの場合、精度は失われませんが、例えばfloat f = 1.1;、それはほぼ確実です。 float f = 1.1;float f = 1.1f;の動作がはっきりと異なる場合、コンパイラは一方を他方に切り替えることはできません。

2

として保存することができ、想定彼らはしなかった場合、私は驚かれることと思います。ステートメントは非常に簡単で、コンパイル時に簡単に解決できます。

厳密に言えば、これに頼ることはできません。意味的にコンバージョンが行われているので、結果は期待通りではない可能性があります。あなたのコードがこれに依存しているなら、あなたは何とか変なことをしているのでしょうか?

関連する問題