decimalは、符号部、指数部と整数部を有します。
整数部だけで12バイトを使います。すなわち、
12 * 8 * log102 = 28.8988...
100.8988 = 7.921...
だからとりうる値の範囲は、約-8×10
28〜8×10
28
です。
指数部は、これを割る10のべきを指定します。
割るのは10
0〜10
28です。
すなわち、表しうる最も小さい正の数は10
-28です。
decimal.js
---------------------------------------------
var a : decimal = 1;
while(a > 0) { //0になったら抜ける
print(a.ToString("E")); //指数表示で出力
a /= 10;
}
上のプログラムは
1から順に一桁ずつ小さくなっていく数値を標準出力するプログラムです。
最後は、1.000000E-028と表示されて終ります。
この
decimal
は大きな数字を扱いたいけど丸め誤差を発生させたくない、
経理ソフトなどに使うために用意されたものです。
整数型と十進数型はオーバーフローすると例外が発生します。
overflow.js
---------------------------------------------------------
var a : int = 0x7fffffff; //intの最大値
try {
print(a);
print(++a); //オーバーフローで例外発生
}
catch(e : System.OverflowException) { //例外を捕らえる
print(e.Message);
}
catch以下は今のところあまり気にしないでください。
浮動小数点数型ではオーバーフローではなくInfinityになります。
overflow2.js
---------------------------------------------------------
var a : float = 1.0;
try {
while(a < Infinity) //約3.4e+38を超えるとInfinity
print(a *= 10);
}
catch(e : System.OverflowException) { //ここには来ない
print(e.Message);
}
10倍ずつしていくと、いつかInfinity(無限)になります。
charはUnicode 1文字を表します。
char.js
---------------------------------------------------------
var a : char;
a = 'a'; //シングルクォートでも
print(a);
a = "a"; //ダブルクォートでも同じ
print(a);
a = "命"; //2バイト文字も
print(a);
a = 0x31; //整数は自動変換
print(a); //1
a += 16; //これも自動変換
print(a); //A
charは内部的には2バイトの整数ですが、
printすると文字が表示されます。
前のページでも使ってましたが、
次のように型キャストします。
var a : uint = 3; //uint型
var b : int; //int型で宣言
b = int(a); //intにキャスト
次のように列挙型を定義できます。
enum Program {
News, Music, Anime, Drama, Sports, Variety
}
型の名前がProgramで、
News, Music, ...というメンバを持ちます。
これを次のように使います。
var a : Program;
a = Program.Anime;
print(String(a)); //Anime
print(int(a)); //2
文字列型にキャストするとメンバ名になります
(この場合、実際には明示的にキャストする必要はない)。
列挙型には『基となるデータ型』というものがあり、デフォルトではintになります。
そして、メンバの値はデフォルトで最初から0, 1, ...となります。
列挙型にはこのデータを入力してもよいです。
var b : Program = 1;
print(b); //Music
『基となるデータ型』は、整数型を使うことができます。
そしてこのデータは次のように定義することができます。
enum Musume : long { //long型
Mame = 5738494866,
Ai = 4251485060,
Nono = 4578515124
}
print(int(Musume.Nono)); //4578515124
この定義を省略した場合は、最初のメンバは0、それ以外は(前の値)+1です。
enum ClassA {
Asami, //0
Kemeko = -1,
Kaori, //0
Makoto //1
}
C/C++と違う演算はこんな感じです。
var a : double = 1 / 3;
print(a); //0.33333...
print(++a); //1.33333...
print(--a); //0.33333...
print(3.1 % 1.6); //1.5
演算はスクリプトらしさを残しています。