本物のC

C の詳細:型変換


integer conversion rank

整数型には以下の規則に基づく integer conversion rank が与えられる6.3.1.1#1

operand の変換

整数拡張(integer promotion)

式のintunsigned intが使える箇所では、常に次を使う事ができる。

  • int及びunsigned intよりも integer conversion rank が低い型のオブジェクトまたは式
  • _Boolintsigned intunsigned int何れかのビットフィールド

これらはintが元の型の値全てを表現できる場合には値はintへ変換され、そうでなければunsigned intへ変換される。他の型は全て整数拡張で不変である。6.3.1.1#2

usual arithmetic conversion

複数の arithmetic type に対する演算は、operand や結果の型を統一する為に以下の変換を行う6.3.1.8#1

  1. operand の片方がlong doubleならばもう一方もlong double
  2. operand の片方がdoubleならばもう一方もdouble
  3. operand の片方がfloatならばもう一方もfloat
  4. 両方の operand へ整数拡張を行った結果、
    • 同じ型ならばこれ以上の変換は必要ない
    • 符号付き/無しが一致していれば、より integer conversion rank が大きい方へ合わせる
    • 一致していない場合、符号無しの方が符号付き以上の integer conversion rank ならば、符号無しへ合わせる
    • それ以外の場合で、符号付きの方が符号無しの型の任意の値を表現できるならば、符号付きへ合わせる
    • 全て当て嵌まらなければ、符号付きの方に対応する符号無し整数型へ合わせる

例えば1ul - 2は 4. の 3 つ目の場合に当たり、int2unsigned longへ変換されて符号無しで計算される。