数値計算の辺りにある不自然な挙動をもうちょっと。
浮動小数から整数に変換する場合のアルゴリズムは、C/C++ と比べると java は非常にわかりやすいし、罠も少ない。と思う。何よりも、処理系依存とか言わないところがすばらしい。
で。こんなコード。
public class Test1 { static void test( double x ){ long i64=(long)x; int i32=(int)x; short i16=(short)x; byte i8=(byte)x; System.out.printf( "\n%e -> integer : \n", x ); System.out.printf( "long : %d\n", i64 ); System.out.printf( "int : %d\n", i32 ); System.out.printf( "short : %d\n", i16 ); System.out.printf( "byte : %d\n", i8 ); } public static void main(String[] args) { test( 1e100 ); test( 1e18 ); test( 1e9 ); } }
実行結果は
1.000000e+100 -> integer :
long : 9223372036854775807
int : 2147483647
short : -1
byte : -1
1.000000e+18 -> integer :
long : 1000000000000000000
int : 2147483647
short : -1
byte : -1
1.000000e+09 -> integer :
long : 1000000000
int : 1000000000
short : -13824
byte : 0
こうなる。
結果を見ると分かるとおり、
- intとlong場合、その型で表せない様な大きな/小さな値は最大値/最小値になる。
- それ以外の場合、int に変換してから入りきらない上位ビットを捨てる
となる。
やはり short と byte は一人前の整数型として扱われない。
まあ、わかればそんなにつらくない仕様だと思う。