数値に小数点も指数もない場合、それはある種の整数です。デフォルトでは、int
.
数値に小数点または指数がある場合、それはある種の浮動小数点数です。デフォルトでは、double
.
それはそれについてです。数値にサフィックス ( ULL
forなどunsigned long long
) を追加して、型をより正確に指定できます。それ以外の場合 (少し単純化します)、整数は値を保持する最小int
の型 (またはそれ以上の型) です。int
あなたの例では、コードは次のとおりです。
float a = 1.0 / 25;
double b = 1 + 2147483649;
の値は、 が double で整数であるa
ことに注意して計算されます。除算を処理するとき、は に変換され、計算が実行され ( が生成されます)、結果がに代入するために強制的に に変換されます。これらはすべてコンパイラで実行できるため、結果は事前に計算されます。1.0
25
int
double
double
float
a
同様に、32 ビットのシステムでint
は、値214783649
が にするには大きすぎるため、 (または のいずれか)int
より大きい符号付きの型として扱われます。が追加され (同じ型が生成されます)、その値が に変換されます。繰り返しますが、すべてコンパイル時に行われます。int
long
long long
1
double
これらの計算は、C の他の計算と同じ規則によって管理されます。
整数定数の型規則は、ISO/IEC 9899:1999 の §6.4.4.1 整数定数で詳述されています。接尾辞 (存在する場合) と定数の型 (10 進数と 8 進数または 16 進数) に応じた型の詳細を示す表があります。10 進定数の場合、値は常に符号付き整数です。8 進数または 16 進数の定数の場合、必要に応じて値が収まり次第、型を符号付きまたは符号なしにすることができます。私の間違いを指摘してくれたDaniel Fischerに感謝します。