C の詳細:型変換
integer conversion rank
整数型には以下の規則に基づく integer conversion rank が与えられる6.3.1.1#1。
- 符号付き整数型について
- T1 ≠ T2
- T1の精度 < T2の精度 ⇒ T1 < T2
- signed char < short < int < long < long long
- Tunsigned = Tsigned
- char = signed char = unsigned char
- enumerated type = compatible integer type
- 同じ精度について Textended < Tstandard
- _Bool < Tstandard
- T1 < T2 かつ T2 < T3 ⇒ T1 < T3(推移律)
operand の変換
整数拡張(integer promotion)
式のintやunsigned intが使える箇所では、常に次を使う事ができる。
- int及びunsigned intよりも integer conversion rank が低い型のオブジェクトまたは式
- _Bool、int、signed int、unsigned int何れかのビットフィールド
これらはintが元の型の値全てを表現できる場合には値はintへ変換され、そうでなければunsigned intへ変換される。他の型は全て整数拡張で不変である。6.3.1.1#2
usual arithmetic conversion
複数の arithmetic type に対する演算は、operand や結果の型を統一する為に以下の変換を行う6.3.1.8#1。
- operand の片方がlong doubleならばもう一方もlong doubleへ
- operand の片方がdoubleならばもう一方もdoubleへ
- operand の片方がfloatならばもう一方もfloatへ
- 両方の operand へ整数拡張を行った結果、
- 同じ型ならばこれ以上の変換は必要ない
- 符号付き/無しが一致していれば、より integer conversion rank が大きい方へ合わせる
- 一致していない場合、符号無しの方が符号付き以上の integer conversion rank ならば、符号無しへ合わせる
- それ以外の場合で、符号付きの方が符号無しの型の任意の値を表現できるならば、符号付きへ合わせる
- 全て当て嵌まらなければ、符号付きの方に対応する符号無し整数型へ合わせる
例えば1ul - 2は 4. の 3 つ目の場合に当たり、intの2がunsigned longへ変換されて符号無しで計算される。