2

为什么会发生这种行为?

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

价值:123450

 

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

价值:42792

这是什么42792?

4

5 回答 5

7

为什么会发生这种行为?

正如以 开头的文字0x被视为十六进制数(以 16 为基数)一样,以 a 开头的文字0被视为八进制数,即以 8 为基数的数字。

(试着写 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 为基数)。但是,println 以 10 为基数写入。

123450 八进制 = 42792 十进制。

于 2011-04-04T14:48:00.640 回答
5

这就是 java 表示八进制文字的方式。看看这个:

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

八进制文字。有关 Java 数字文字的详细描述,尽管有些枯燥,请参阅 Java Language Specification, 3.10.1。要查找和研究更多类似的有趣内容,请参阅“Java 谜题”一书

于 2011-04-04T14:52:42.063 回答
0

此功能可以追溯到早期的“C”时代。前导“0”表示八进制,前导“0x”表示十六进制。有人建议将“0b”用于 JDK 7 的二进制数。

您可以解析这样一个数字,Integer.decode(String)它也接受一个前导 '#' 作为十六进制数字。

于 2011-04-04T15:10:52.540 回答