2

なぜこの動作が発生するのですか?

long value = 123450;
System.out.println("value: " + value); 

値: 123450

 

long value = 0123450;
//           ^
System.out.println("value: " + value); 

値: 42792

この42792は何ですか?

4

5 に答える 5

7

なぜこの動作が発生するのですか?

で始まるリテラルが 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

于 2011-04-04T14:47:37.830 に答える
5

数値の前にゼロを付けると、8 進数 (基数 8) と見なされます。ただし、println は base 10 で書き込みます。

8 進数の 123450 = 10 進数の 42792。

于 2011-04-04T14:48:00.640 に答える
5

これが、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)); 
于 2011-04-04T14:48:03.103 に答える
3

8 進リテラル。Java 数値リテラルの詳細な説明については、Java 言語仕様 3.10.1 を参照してください。そのようなもっと楽しいことを見つけて勉強するには、「Java puzzlers」のを参照してください。

于 2011-04-04T14:52:42.063 に答える
0

この機能は初期の「C」の時代にさかのぼります。先頭の「0」は 8 進数、先頭の「0x」は 16 進数です。JDK 7 では、「0b」を 2 進数にすることが提案されています。

Integer.decode(String)先頭の「#」も 16 進数として受け入れるような数値を解析できます。

于 2011-04-04T15:10:52.540 に答える