2012-04-17 12 views
0

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

これは型変換とプロモーションに影響するため、私は不思議です。私は次の計算を持っている場合たとえば、:

float a = 1.0/25; 

はint型として扱われ、ダブル、25として扱わ1.0ですか? 25は次にdoubleに昇格され、倍精度で計算が実行され、結果がfloatに変換されますか?

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

標準ではまだカバーされていないことを教えてください。 –

+1

私の解決策は常に「コンパイラに伝えさせてください」 –

+0

1.0は浮動小数点数であり、25は式の整数です。除算は浮動小数点に強制されましたが、1.0に小数点を落とした場合、整数であり、除算は2つの整数(0)です。 – lukecampbell

答えて

3

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

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

それはそれです。数字に接尾辞を付けると(ULLunsigned long longなど)、より正確にタイプを指定できます。それ以外の場合(少し簡略化します)、整数は値を保持する最小のintタイプ(タイプint以上)です。あなたの例では

、コードは次のとおり

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

aの値を1.0は二重であり、25が整数であることに留意することによって計算されます。除算を処理する場合、intdoubleに変換され、計算が実行され(doubleを生成する)、結果はaに代入されてfloatに強制的に変換されます。これはすべてコンパイラによって実行されるので、結果はあらかじめ計算されます。

同様に、32ビットintを有するシステムに、値214783649intことが大きすぎるので、intlong又はlong longいずれか)よりも大きな符号付き型として扱われます。 1が追加され(同じタイプを生成する)、その値はdoubleに変換されます。ここでもコンパイル時にすべて実行されます。 :1999

これらの計算は、整数定数の型規則は、ISO/IECの§6.4.4.1整数定数9899に詳述されているC.


に他の計算と同じ規則によって支配されます。接尾辞(ある場合)と定数のタイプ(10進数と8進数または16進数)によってタイプを詳述する表があります。 10進定数の場合、値は常に符号付き整数です。 8進定数または16進定数の場合、必要に応じて、また値が適合するとすぐに型に符号付きまたは符号なしを指定できます。私の間違いを指摘してくれたDaniel Fischerに感謝します。

+1

2147483649は6.4.4.1で、接尾辞なしの10進定数で、 'unsigned int'ではなく' int'、 'long int'、' long long int'の最初の型になります。それにもかかわらず、良い答え、+1。 –

+0

ありがとう、@ダニエル;一定。 –

0

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

標準は、あなたが期待することができますが、コンパイラは最適化するための標準的なだけでなく、ルールを包含する規則のスーパーセットを持っているもののための一般的なガイドラインがありますについてどう

。上記のリンクは、あなたが期待できる一般的なもののいくつかについて説明しています。暗黙の強制を心配する場合は、通常、明示的なキャストを使用することをお勧めします。

プリミティブ型のサイズは保証されません。

1.0/25 

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

double b = 1 + 2147483649; 

右側は整数として評価した後、割り当て中の二重に強制されます。

+0

ええ、私もそれを見ました。どのような型変換が説明されています。 [この記事の一部](http://en.wikipedia.org/wiki/Type_conversion#Implicit_type_conversion)は優れていますが、おそらく包括的ではありません。 –

0

実際には、あなたの例では、コンパイラの警告を受けるかもしれません。 1.0fを書いて浮動小数点にするか、結果を割り当てる前に明示的にキャストしてください。

関連する問題