数値に小数点も指数もない場合は、ある種の整数です。デフォルトではint
です。
数値に小数点または指数がある場合、それはある種の浮動小数点数です。デフォルトではdouble
です。
それはそれです。数字に接尾辞を付けると(ULL
:unsigned long long
など)、より正確にタイプを指定できます。それ以外の場合(少し簡略化します)、整数は値を保持する最小のint
タイプ(タイプint
以上)です。あなたの例では
、コードは次のとおり
float a = 1.0/25;
double b = 1 + 2147483649;
a
の値を1.0
は二重であり、25
が整数であることに留意することによって計算されます。除算を処理する場合、int
はdouble
に変換され、計算が実行され(double
を生成する)、結果はa
に代入されてfloat
に強制的に変換されます。これはすべてコンパイラによって実行されるので、結果はあらかじめ計算されます。
同様に、32ビットint
を有するシステムに、値214783649
はint
ことが大きすぎるので、int
(long
又はlong long
いずれか)よりも大きな符号付き型として扱われます。 1
が追加され(同じタイプを生成する)、その値はdouble
に変換されます。ここでもコンパイル時にすべて実行されます。 :1999
これらの計算は、整数定数の型規則は、ISO/IECの§6.4.4.1整数定数9899に詳述されているC.
に他の計算と同じ規則によって支配されます。接尾辞(ある場合)と定数のタイプ(10進数と8進数または16進数)によってタイプを詳述する表があります。 10進定数の場合、値は常に符号付き整数です。 8進定数または16進定数の場合、必要に応じて、また値が適合するとすぐに型に符号付きまたは符号なしを指定できます。私の間違いを指摘してくれたDaniel Fischerに感謝します。
標準ではまだカバーされていないことを教えてください。 –
私の解決策は常に「コンパイラに伝えさせてください」 –
1.0は浮動小数点数であり、25は式の整数です。除算は浮動小数点に強制されましたが、1.0に小数点を落とした場合、整数であり、除算は2つの整数(0)です。 – lukecampbell