使用している型を別の型に変換(キャスト)する必要がよく発生します。
但し、全ての型が別の型に変換できるわけではありません。
以下は、キャストのスキームです。
変換元の型 |
キャスト可能な型 |
char |
short |
uchar |
short
ushort
|
short |
int
float
|
ushort |
uint
int
float
|
int |
long
double
float(データ損失の可能性有)
|
uint |
ulong
long
|
long |
float(データ損失の可能性有)
double(データ損失の可能性有)
|
ulong |
double(データ損失の可能性有)
|
float |
double |
double |
無し |
char型の代わりに
bool型を使う事が出来ます(両方とも1byteのデータ)。
またint型の代わりに
color型を使う事が出来ます(両方とも4byteのデータ)。
long型の代わりに
datetime型を使う事が出来ます(両方とも8byteのデータ)。
データ損失の可能性が有るキャストは、変換元のデータが変換先の精度を超えた場合に発生します。
サンプルソース:
int tmp_int = 123456789;
float tmp_float;
tmp_float = (float)tmp_int;
Print(tmp_float);
#property strict無しの場合、
逆方向のキャスト(大きいサイズの型から小さいサイズへの型変換)を行ってもコンパイラは警告しません。
警告が出なくなるだけで不具合の原因となる問題は何も解決されていないので、
#property strictは絶対に削除しないで下さい。
上記スキームに記載されていないキャストを行う事は出来ますが、データ損失の可能性があります。
例えば、short型(2byteデータ)をchar型(1byteデータ)にキャストする場合等です。
また浮動小数点の値を整数型にキャストした場合は、小数点以下の値は常に削除されます。
小数点以下を意図的に切り捨てしたい場合は整数型にキャストで大丈夫ですが、四捨五入したい場合は
MathRound()を使用します。
2つの値が演算によって結合される時、演算実行前に優先順位に従ってより優先順位の高い方に変換されます。
◆優先順位
char(uchar,short,usrhot) ⇒ int ⇒ uinit ⇒ long ⇒ ulong ⇒ float ⇒ double
右に行く程優先順位が高い。
char,uchar,short,ushort型は無条件で
int型に変換されます。
サンプルソース:
char tmp_char=3;
double temp_double;
temp_double = tmp_char/2 + 0.3;
Print(temp_double);
temp_double = tmp_char/2.0 + 0.3;
Print(temp_double);
整数変換の例では、除算の演算に使用した定数の値が2(int型)なので、演算の対象となるchar型のtemp_charは一時的にint型にキャストされます。
int型の整数除算なので3/2の結果は小数点以下が切り捨てられ、1になります。そしてその演算結果の型もint型です。
浮動小数点数変換の例では、定数の値が2.0(
double型)なので、一時的にdouble型にキャストされます。
double型の浮動小数点数除算なので3/2の結果は、1.5になります。
明示的なキャスト
サンプルソース:
char tmp_char=3;
double temp_double;
temp_double = (double)tmp_char/2 + 0.3;
Print(temp_double);
除算演算が行われる前に
char型のtemp_charは一時的にdouble型に明示的キャストします。
double型の整数除算なので整数定数の2はdouble型の2.0にキャストされます。
結果(double)tmp_char/2の演算結果は1.5になります。
キャストは単項演算です。
キャストによって演算結果が型の範囲を超える場合があります、その場合型のサイズに収まらないbitは切り捨てられます。
代入時の暗黙的キャスト
演算(代入演算子以外)が行われる前に、データは優先順位の最も高い型に変換されます。
代入演算が実行される前に、データはキャストされます。
文字列(string)のキャスト
文字列型は最も高い優先順位を持ちます。
演算処理に文字列型がある場合、文字列型以降は自動的に文字列型にキャストされます。
サンプルソース:
string temp;
temp = 1 + 1;
Print(temp);
temp = 1 + 1 + "str" + 1 + 1 + 1;
Print(temp);
単純な構造体のキャスト
単純な構造体のデータは構造体メンバが全てが数値で構成されます。
単純な構造体を他の単純な構造体へ代入する場合、メンバのキャストは行われず単純にコピーされます。
異なるサイズの構造体であれば、より少ないサイズのbyte数だけコピーされます。
サンプルソース:
struct st_1 {
char st1_char;
};
struct st_2 {
short st2_short;
};
struct st_3 {
int st3_int1;
int st3_int2;
};
int OnInit(){
st_1 s1;
st_2 s2;
st_3 s3;
s1.st1_char= 2;
s2=s1;
Print( s1.st1_char , " " , s2.st2_short);
s3=s2;
Print( s3.st3_int1, " " , s3.st3_int2);
return 0;
}