「プログラミング言語C第2版」(B.W.カーニハン/D.Mリッチー著)を参考にしています。
自動的に行われる型変換
自動的に行われる型変換は、「より狭い」被演算子から「より広い」被演算子に変換するものだけである。
暗黙の算術変換
一般的に、二項演算子に異なる型の被演算数が現れると、低い型が高い型に格上げされてから演算が実行され、その結果も高い型になる。
-
まず、いずれかの被演算数が
long double
なら、他方もlong double
に変換される -
そうでなくて、片方の被演算数が
double
なら、他方もdouble
に変換される -
そうでなくて、片方の被演算数が
float
なら、他方もfloat
に変換される -
そうでない時は、両方の被演算数に対して整数への格上げが行われる
- 片方の被演算数が
unsigned long int
なら、他方もunsigned long int
に変換される - そうでなくて、片方の被演算数が
long int
で、他方がunsigned int
である時には、long int
がunsigned int
の全ての値を表現できるかに左右される- 可能な時:
unsigned int
の被演算数がlong int
に変換される - 不可能な時:両方が
unsigned long int
に変換される
- 可能な時:
- そうでなくて、片方の被演算数が
long int
の時には、他方もlong int
に変換される - そうでなくて、片方の被演算数が
unsigned int
であれば、他方もunsigned int
に変換される - そうでない時には、両方の被演算数は
int
型である
- 片方の被演算数が
注意点として、式の中のfloat
は自動的にdouble
に変換されることはない、という点が挙げられる。メモリの都合上このようになっているらしい。
代入時の変換
代入において、右辺の値が左辺の型に変換され、それが結果の型となる。つまり、長い整数がchar
や短い整数に代入される際には、余分な上位ビットは捨てられることになる。
他にも、float
からint
への変換は小数部分が切り捨てられる。また、double
->float
は値が丸められるか切り捨てられるかは処理系に依存する。
明示的な型変換(cast)
以下の構文で強制変換をすることができる。
(type-name) expression
以下に例を示す。
sqrt((double)n)
これは関数sqrt()
に引数n
を渡す前に、double
に変換される例である。この時、n
自身の型は変化しない。
なお、事前に関数のプロトタイプdouble sqrt(double)
が与えられている場合は、キャストを用いずとも自動的に型変換が行われる。