Javaのデータ型でのメモ

はじめに

Java Silverの勉強をちまちまやっているんですが、そんな細かい仕様知らねえよ、そんな実装しねえよ!!!っていうところをついてくるのが、この試験のポイントなのかもしれません。お勉強をしていたら、わりと初めて知ることが多かったので記録しておきます。まずはデータ型について。

2進数、8進数、16進数で整数リテラルで記述する

public class test {
	public static void main (String[] args){
		int BinaryNumber = 0b00001;  //  2進数
		int Octal = 077777;          //  8進数
		int Hexadecimal = 0xFFFFF;   // 16進数
		System.out.println(BinaryNumber);  // 1
		System.out.println(Octal);         // 32767
		System.out.println(Hexadecimal);   // 1048575
	}
}

接頭辞として2進数なら0b、8進数なら0、16進数なら0xと記述すると、上記のように表現できます。Java SE 7で導入されたらしいのですが、正直覚える必要あるのかはよくわかりません。知ってたらいいなレベルな気がします。

ちなみに、

public class test {
	public static void main (String[] args){
		int BinaryNumber = 0b00002;  //  2進数
		System.out.println(BinaryNumber);  // ←ねえよ!!!
	}
}

と書いてコンパイルすると、

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	トークン "2" に構文エラーがあります。このトークンを削除してください

	at javaPractice.test.main(test.java:7)

2進数は{0,1}のいずれかでしか表現できないため、0b00002はエラーとなります。
次。

アンダースコアを用いた整数リテラルの表記

整数リテラルの表記について。こちらもJava SE 7で導入されたもので、桁数の多い数値リテラルの可読性を向上させるために、アンダースコア(_)を用いた記述ができるとのこと。ただし、

  • リテラルの先頭、末尾には記述できない
  • 記号の前後には記述できない

のルールがあります。

サンプル:

public class test {
	public static void main (String[] args){
		int a = 123_456_789;
		int b = 5_________2;
		// int c = _123_456_789;   <= _がリテラルの先頭にあるのでダメ
		// int d = 123_456_789_;   <= _がリテラルの末尾にあるのでダメ
		// float e = 3_.1415F;     <= _が記号(.)の前にあるのでダメ
		// long f = 999_99_9999_L; <= _が記号(L)の前にあるのでダメ
		byte g = 0b0_1;
		int h = 0_52;
		//int i = 0x_52;           <= _が記号(x)の後ろにあるのでダメ
		
		System.out.println(a); // 123456789
		System.out.println(b); // 52
		System.out.println(g); // 1
		System.out.println(h); // 42
	}
}

桁数の多い整数リテラルなら、可読性向上のためにアンダースコアを用いた表記はありかなと思いました。わりと使えそうですね。もちろん、そういうお作法ができることを知っている人たちが多ければ、なんですが。