データ型

変数や値には、データの種類に応じて、いくつかの型が存在します。ここでは、VCSSLで扱えるデータ型を紹介します。

- 目次 -

データ型とは

プログラム内のデータには、変数に格納されているものや、式の中などに直接記述されている値も含めて、いくつかの種類があります。 この種類の事をデータ型と言います。 VCSSLの変数では、格納する値のデータ型は宣言時に決める必要があり、その後は変えられません( いわゆる静的型付けです )。

データ型によって、それぞれ扱える種類の値と、扱えない種類の値があります。また、行える演算にも違いがあります。例えば整数を扱うint型で文字列は扱えません。また、文字列を扱うstring型を用いて四則演算はできません。 従って、変数を宣言する際は、扱う値の種類に適したデータ型を選んで宣言しておく必要があります。

VCSSLでサポートされているデータ型には、以下のようなものがあります。

扱える値 容量 詳細
string 文字列 任意長 文字列を格納するためのデータ型です。
int
または
long
整数 64bit
18桁程度
整数を扱うためのデータ型です。処理に64bitの2進法が適用されるので、高速な計算が可能です。
float
または
double
小数 64bit
15桁程度
小数を扱うためのデータ型です。処理に64bitの2進法が適用されるので、高速な計算が可能です。精度はあまり良くなく、計算する度に、末尾の数桁に計算誤差が生じます。
complex 複素数 float
× 2値
複素数を扱うためのデータ型です。float 型の実数値と虚数値を持ちます。
varint 任意桁
の整数
任意桁数 整数を扱うためのデータ型です。非常に高精度な計算方法が適用されるので、どこまでも長い桁数を扱う事ができます。反面、int型よりも処理速度は数十倍以上遅くなります。
varfloat 任意桁
の小数
任意桁数 小数を扱うためのデータ型です。非常に高精度な計算方法が適用されるので、どこまでも長い桁数を扱う事ができます。反面、float型よりも処理速度は数十倍以上遅くなります。
varcomplex 任意桁
の複素数
varfloat
× 2値
複素数を扱うためのデータ型です。varfloat型の実数値と虚数値を持ちます。
bool 真偽値
true / false
二択 条件判定などの結果を扱うためのデータ型です。値のtrueとfalseの意味は、そのままYESとNOと解釈しても差し支えないでしょう。
struct 構造体 - 任意の型・個数の変数をまとめて扱う型です。

※他のプログラミング言語では、int型とfloat型の容量に比べて、long(または long int など)型とdouble型の容量が倍( またはそれ以上 )になっている場合がよくあります。 VCSSLではこれらは全て64bitの精度を持つため、区別する必要はありません。 long や double 型がサポートされているのは、あくまでも他の言語へのコードの移植性を考慮した仕様です。

整数型を利用する

例として、整数を格納できるint型の変数を使用してみましょう:

IntToInt.vcssl

- 実行結果 -

1

このプログラムを実行すると、VCSSLコンソールに「 1 」と表示されます。

ところで、int型の変数に、整数以外のものを代入すると、 どうなるのでしょうか。以下のようなプログラムを実行してみてください:

FloatToInt.vcssl

- 実行結果 -

2

このプログラムを実行すると、VCSSLコンソールに「 2 」が表示されます。つまり、代入された「2.883」の小数点以下を切り捨て、無理矢理に整数に変換して代入された事がわかります。 このように、変数は、自分の型では扱えない値が代入されると、自分が扱える値に変換してから受け取ります。

このようなルールを「暗黙の型変換」と呼びます。 なお、変換不能な値が代入された場合は、エラーが出力され、プログラムが強制終了されます。

さて、小数(実数、浮動小数点数)を扱うには、本来ならdouble型またはfloat型を使用すべきです。それには以下のように記述にします:

FloatToFloat.vcssl

- 実行結果 -

2.883

このプログラムを実行すると、VCSSLコンソールに「 2.883 」と正しく表示されます。

キャスト演算(明示的な型変換)

上の例において、整数型に小数値を代入すると、無理矢理に整数へと変換される事を述べました。 このような変換は、以下のように、任意の場所で明示的に行う事もできます:

CastFloatToInt.vcssl

- 実行結果 -

2

このプログラムを実行すると、VCSSLコンソールに「 2 」と表示されます。

このプログラムの「 (int) 」の部分に着目してください。 このようにデータ型をカッコで囲んだ記述の事をキャスト演算子と呼びます。 キャスト演算子は、すぐ右側の値を、任意の型へ強制的に変換する演算子です。 上の例では、「2.883」を強制的に整数へ変換し、「2」にしたのです。

複素数型を使用する

続いて、複素数を格納できるcomplex 型を使用してみましょう:

ComplexAdd.vcssl

- 実行結果 -

(1.0,2.0)

このプログラムを実行すると、VCSSL コンソールに「 (1.0,2.0) 」と表示されます。

ここで「 I 」は、虚数単位の値をもつ変数(定数)で、システムによって自動的に定義されています。

小数に I を乗算すると虚数になります。上の例での値は数学的に 1 + 2 i に相当します。

なお、複素数型の実部や虚部を取得するには、 re 関数と im 関数を使用します:

ComplexRe.vcssl

- 実行結果 -

1.0

このプログラムを実行すると、VCSSL コンソールに「 1.0 」 と表示されます。これはc の実部です。

re 関数の代わりにim 関数を使用すると、コンソールにはc の虚部である「 2.0 」が表示されます。

可変精度変数を使用する

小数には、有限精度のdouble型 またはfloat型の他にも、任意の精度を持つvarfloat型も用意されています。

これは、使用する桁数を無制限に指定でき、なおかつ実行中の桁数変更も可能な変数です。 桁数は、プログラム中でdigit関数を呼び出します:

VarfloatDiv.vcssl

- 実行結果 -

3.3333333...(100桁まで続く)

これを実行すると、100桁まで 3.33333333… が出力されます。

なお、varfloat型の桁数を制御するdigit関数は、設定した桁数を値として返します。 この性質を利用し、digit関数を空で呼び出すことにより、現在の演算桁数を取得できます:

GetDigit.vcssl

可変精度型の数値

2つ上のプログラムでは、「 10.0vf 」のように、数値の後に「 vf 」が付加されていました。 これは、その数値がvarfloat型である事を明示するためのものです。

通常は、式の中に直接記述した数値にも、適したデータ型が自動で割り当てられます。 しかし、varfloat型とvarint型を使用する際には注意が必要です。 式の中に少数や整数が存在する場合、それがfloat型になるのかvarfloat型になるのか、 またはint型になるのかvarint型になるのかは、言語仕様として定まってはいません。

従って、確実にvarfloat型の数値を割り当てたい場合には末尾に「 vf 」を、 また確実にvarint型を割り当てたい場合は末尾に「 v 」を付加しておく事が推奨されます。

例として、以下の2つのプログラムを比較してみましょう。

FloatLiteralDiv.vcssl

- 実行結果 -

3.3333333...(16桁程度)

もう一つ、数値の末尾にvfを付加した場合を試します:

VarfloatLiteralDiv.vcssl

- 実行結果 -

3.3333333...(100桁まで続く)

上のプログラムでは、VCSSLコンソールに16桁程度「 0.33333... 」と出力されます。 つまり式の中の数値がdouble型またはfloat型として扱われた事を意味します。

下のプログラムでは、今度は100桁程度「 0.33333... 」と出力されます。 数値の末尾に「 vf 」を付けたため、数値がvarfloat型として扱われた事を意味します。

可変精度型の複素数

可変精度の複素数varcomplex型は、以下のように使用します。

Varcomplex.vcssl

上のプログラムでは、VCSSLコンソールに 30桁 「0.33333... 」、 次に行に 「0.14285... 」 と出力されます。 上でVCIは可変精度の虚数単位で、complex型の場合のIに相当するものです。 re関数 / im関数をvarcomplex型に対して使用した場合、 実部 / 虚部をvarfloat型で取得できます。