代入式や関数の引数で、異なる型のリテラルや変数が指定された場合は代入先の変数の型に合わせられます。 多くの言語では、情報が削られる可能性の無い拡張変換(型のサイズを大きくする変換)は暗黙的に行い、情報が削られる可能性のある縮小変換は明示的に指定されない場合は警告などを出すという実装が多く見られます。 縮小変換の場合、情報を表現するためのバイトサイズが小さくなるため、上位ビットが削られる可能性を考慮しなければならないのです。
import std.stream; int main() { int iValue = 383; byte bValue = iValue; stdout.printf("%d" , bValue); return 0; }
このプログラムでは int 型の変数 iValue に 383 を代入し、この iValue 変数を byte 型の変数 bValue に代入しています。 このとき、bValue 変数は byte 型であるため int 型の値は byte 型に縮小変換されて代入されます。 この縮小変換では 383 という値を 1 バイトに縮小してしまうため、上位ビットが削られて 127 という値が表示されます。
暗黙的な変換ではなく、明示的に変換したい場合はキャスト式を使います。 キャスト式は、明示的に変換したい型を指定して値を変換します。
C 言語では ( ) を用いて型キャストを指定しましたが、これには次のような問題があります。
( type ) - x
この場合、type から x を減算させる式と解釈することもできるため曖昧な表現であると D 言語は考えています。 そこで D 言語の型キャスト変換式は cast キーワードを用いて次のように記述します。
cast ( 型 ) 式
この型キャスト式は指定された式の結果を、指定した型に変換することを明示的に表しています。
import std.stream; int main() { char chValue = 'A'; int iValue = cast(int)chValue; stdout.printf("%d" , iValue); return 0; }
このプログラムでは、明示的に文字型の変数 chValue を int 型に cast() 式を用いて変換しています。