型変換
暗黙の型変換は、明示的に指定しなくてもコンパイラの判断によって自動的に行われる型変換で、型強制(type coercion)ともいう。逆に、明示的に指定して行う型変換を明示的型変換という。
暗黙の型変換では、たとえばある式の中に複数の型の変数がある場合、すべての変数を最も上位の型に変換する。
このC言語のコードでは、dとlとiは異なったデータ型をもっているので、すべての演算は自動的に同じ型に変換された後に行われる。より大きなサイズの型に変換されることを拡大変換 (widening conversion) と呼び、より小さなサイズの型に変換されることを縮小変換 (narrowing conversion) と呼ぶ。
暗黙の型変換には注意しなければならないこともある。たとえばdouble型(浮動小数点数)の値をint型(整数型)の変数に代入する場合、小数点以下の端数があったり、元の値がint型で表現できる範囲を超えていたりすると、縮小変換により情報の一部が失われてしまう。浮動小数点数特有の誤差により、意図せず切り捨てられてしまうこともありうる。また、符号付き整数と符号無し整数との間の暗黙変換に関しても、同様に情報が失われたり、整数オーバーフローにより意図しない値になってしまったりする可能性がある。C言語およびC++では暗黙の縮小変換を許しているが、情報が失われる可能性のある変換に対して、通例コンパイラが警告を出す。JavaやC#などの後発言語では、暗黙の縮小変換を許可せず、後述するキャスト (cast) 構文による明示的な変換が必要となる。さらに型の扱いが厳密なF#などの関数型言語では、暗黙の拡大変換も許可せず、キャスト構文による明示的な型変換が必要となる。
整数どうしの型変換や整数と浮動小数点数との間の型変換などの、ごく一般的な型変換。内部的には64bitで表すデータを32bitなどに変換する縮小変換や、32bitで表すデータを64bitなどに変換する拡大変換を伴う場合もある。一例としては、JavaやC#のintからlongへの型変換はサイズ長を倍化させる拡大変換であり、逆にlongからintへの型変換はサイズ長を半減させる縮小変換である。