CLOVER🍀

That was when it all began.

Java SE 7のバイナリリテラルと、アンダースコア入り数値リテラルについて

Java SE 7で導入されたアンダースコア入り数値リテラルですが、今日ちょっと勉強していて、いろいろあったのでちょっと試してみました。

数値リテラルの途中に「_」が入れられるというものですが、

  • リテラルの先頭と末尾には記述できない
  • 記号の前後には記述できない(記号とは、数値リテラル中に登場する「.」、「L」、「F」、「D」、「0b」、「0x」など)

という例外があります。

実際に問題集(笑)の内容を試してみます。

int i1 = 123_456_789;
int i2 = 5_______2;
// int i3 = _123_456_789; // コンパイルエラー(リテラルの先頭と末尾には記述できない)
// int i4 = 123_456_789_; // コンパイルエラー(リテラルの先頭と末尾には記述できない)
// float f1 = 3_.1415F; // コンパイルエラー(記号の前後には記述できない) 小数点(.)の前
// long l1 = 999_99_9999_L; // コンパイルエラー(記号の前後には記述できない) Lの前
byte b1 = 0b0_1;
int i5 = 0_52;
// int i6 = 0x_52; // コンパイルエラー(記号の前後には記述できない) xの後

ここにさらにバイナリリテラルが混じると、もっと話がややこしくなるみたいです…。

// int i1 = 0b_1001; // コンパイルエラー(記号の前後には記述できない) bの後
long l1 = 0b100_01L;
float f1 = 0b10_01;
// float f2 = 0b10_01F; // コンパイルエラー(バイナリリテラルはFと一緒には使えない)
double d1 = 0b10_01;
// double d2 = 0b10_01D; // コンパイルエラー(バイナリリテラルはDと一緒には使えない)

バイナリリテラルでfloatやdoubleは書けるものの、「F」と「D」は一緒に使えないらしいです。まあ、2進表記ですからね…。

というか、こんな書き方、普通やらない。たぶんやらない。