なぜこの動作が発生するのですか?
long value = 123450;
System.out.println("value: " + value);
値: 123450
long value = 0123450;
// ^
System.out.println("value: " + value);
値: 42792
この42792は何ですか?
なぜこの動作が発生するのですか?
long value = 123450;
System.out.println("value: " + value);
値: 123450
long value = 0123450;
// ^
System.out.println("value: " + value);
値: 42792
この42792は何ですか?
なぜこの動作が発生するのですか?
で始まるリテラルが 16 進数 (基数 16)として扱われるよう0x
に、a で始まるリテラルは8 進数、つまり基数 8 の数値として扱われます。0
(0789 と書いてみると、コンパイラがエラーを出すことがわかります。)
この42792は何ですか?
基数 8 の数値 123450 は数値を表します
1 ×8 5 + 2 ×8 4 + 3 ×8 3 + 4 ×8 2 + 5 ×8 1 + 0 ×8 0 = 42792
数値の前にゼロを付けると、8 進数 (基数 8) と見なされます。ただし、println は base 10 で書き込みます。
8 進数の 123450 = 10 進数の 42792。
これが、Java が 8 進数リテラルを表す方法です。これを見てください:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
左側にゼロがあるものを印刷したい場合は、DecimalFormatフォーマット メソッドを使用する必要があります。
http://download.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html
その場合、次のようにします。
long value = 123450;
DecimalFormat df = new DecimalFormat("0");
System.out.println("value: " + df.format(value));
8 進リテラル。Java 数値リテラルの詳細な説明については、Java 言語仕様 3.10.1 を参照してください。そのようなもっと楽しいことを見つけて勉強するには、「Java puzzlers」の本を参照してください。
この機能は初期の「C」の時代にさかのぼります。先頭の「0」は 8 進数、先頭の「0x」は 16 進数です。JDK 7 では、「0b」を 2 進数にすることが提案されています。
Integer.decode(String)
先頭の「#」も 16 進数として受け入れるような数値を解析できます。