0

Cの数値の暗黙の型は何ですか? たとえば、計算に 10 進数がある場合、その 10 進数は常に double として扱われますか? 非 10 進数の場合、常に int として扱われますか? 非 10 進数が int 値より大きい場合はどうなりますか?

これは型変換と昇格に影響するので、私は興味があります。たとえば、次の計算があるとします。

float a = 1.0 / 25;

1.0double として25扱われ、int として扱われますか? その後、倍精度に昇格され、計算が25倍精度で実行され、結果が浮動小数点数に変換されますか?

どうですか:

double b = 1 + 2147483649;   // note that the number is larger than an int value
4

3 に答える 3

4

数値に小数点も指数もない場合、それはある種の整数です。デフォルトでは、int.

数値に小数点または指数がある場合、それはある種の浮動小数点数です。デフォルトでは、double.

それはそれについてです。数値にサフィックス ( ULLforなどunsigned long long) を追加して、型をより正確に指定できます。それ以外の場合 (少し単純化します)、整数は値を保持する最小intの型 (またはそれ以上の型) です。int

あなたの例では、コードは次のとおりです。

float a = 1.0 / 25;
double b = 1 + 2147483649;

の値は、 が double で整数であるaことに注意して計算されます。除算を処理するとき、は に変換され、計算が実行され ( が生成されます)、結果がに代入するために強制的に に変換されます。これらはすべてコンパイラで実行できるため、結果は事前に計算されます。1.025intdoubledoublefloata

同様に、32 ビットのシステムでintは、値214783649が にするには大きすぎるため、 (または のいずれか)intより大きい符号付きの型として扱われます。が追加され (同じ型が生成されます)、その値が に変換されます。繰り返しますが、すべてコンパイル時に行われます。intlonglong long1double

これらの計算は、C の他の計算と同じ規則によって管理されます。


整数定数の型規則は、ISO/IEC 9899:1999 の §6.4.4.1 整数定数で詳述されています。接尾辞 (存在する場合) と定数の型 (10 進数と 8 進数または 16 進数) に応じた型の詳細を示す表があります。10 進定数の場合、値は常に符号付き整数です。8 進数または 16 進数の定数の場合、必要に応じて値が収まり次第、型を符号付きまたは符号なしにすることができます。私の間違いを指摘してくれたDaniel Fischerに感謝します。

于 2012-04-17T20:42:38.410 に答える
0

実際に。あなたの例では、コンパイラの警告が表示される場合があります。1.0f を記述して最初に float にするか、結果を割り当てる前に明示的にキャストします。

于 2012-04-17T22:40:52.237 に答える
0

http://en.wikipedia.org/wiki/Type_conversion

標準には、期待できることに関する一般的なガイドラインがありますが、コンパイラには、標準と最適化のための規則を含む規則のスーパーセットがあります。上記のリンクでは、期待できる一般性のいくつかについて説明しています。暗黙的な強制が懸念される場合は、通常、明示的なキャストを使用することをお勧めします。

プリミティブ型のサイズは保証されていないことに注意してください。

1.0 / 25

オペランドの 1 つが double であるため、double に評価されます。に変更した場合1/25、評価は 2 つの整数として実行され、 に評価され0ます。

double b = 1 + 2147483649;

右辺は整数として評価され、割り当て中に double に強制されます。

于 2012-04-17T20:40:15.040 に答える