int型に関する勘違い

突然ですが、以下のスクリプトをパブリッシュしたらどうなるでしょうか?

var hoge1:Number = Math.PI;
var hoge2:int = hoge1;
trace("hoge1:", hoge1);
trace("hoge2:", hoge2);

「そんなのコンパイラーに怒られるに決まってるでしょ?」と思った方、いませんか?「だってhoge2は整数って型指定されているんだから、そこに少数(浮動小数点数って言うのかな?)は代入できないじゃない」と。はい。僕がそう思ってたわけですね。

ところがこれの出力結果は、

hoge1: 3.141592653589793
hoge2: 3

のようになります。

int型と型指定されたhoge2は「それは小数じゃないから、許しませんよ」と不平を言う代わりに、気を利かせて小数点以下を切り捨てして整数化してくれているんですねー。ですよねー?

ということは、整数の乱数を生成したいときも、

var rnd:int = Math.random() * 10;

みたいに書けてしまうわけですよね?

ただこれってやっぱり、rndが整数であることを明示的に表すために

var rnd:int = Math.floor(Math.random() * 10);

みたいにしたほうが正しいのかなぁ?

余談ですが、以下のように負の少数の値をuint型の変数に代入すると、

var hoge3:uint = -Math.PI;
trace("hoge3:", hoge3);
hoge3: 4294967293

uint型の最大値が出力されました。はて?

こういうことは恐らくプログラムの基本なのでしょうが、「こんなことも分からないけれど、ActionScriptとか書いているよー。だからみんなもガンガロウ」が、僕のblogの基本なので。これからも堂々と間違いを晒していきますよ、と。


[08/28追記]
この件に関し、FumioNonaka.com Newsletter No.45に解説がありました。異なる数値型の型指定をすると、(キャストを使用せずに)黙示的に値が変換されるそうです。ですが、Number型を指定した上できちんと値の変換を行ったほうが安全のようです。
ドキュメントにも書いてあるんですね。