鍋あり谷あり

テーマを決めずに適当に書いています。

私の知っているjava - 浮動小数点から整数

数値計算の辺りにある不自然な挙動をもうちょっと。

浮動小数から整数に変換する場合のアルゴリズムは、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

こうなる。
結果を見ると分かるとおり、

  1. intとlong場合、その型で表せない様な大きな/小さな値は最大値/最小値になる。
  2. それ以外の場合、int に変換してから入りきらない上位ビットを捨てる

となる。
やはり short と byte は一人前の整数型として扱われない。
まあ、わかればそんなにつらくない仕様だと思う。